天殺的 [Cannot forward after response has been committed] @ tomcat

這件鳥事, 無論如何一定要 memo 起來,
看能不能像另外一篇 : 當 Norton Ghost 2003 遇上 SATA HD 一樣, 加減解救一些人 ...

事情是這樣地 :
最近一個非常小非常簡單的案子, 簡單到只有 3 頁, 我們一樣用 jsp / servlet @ tomcat 實作
本來一些其它的問題都解決了, 眼看著就要上線, 驗收, 結案了
偏偏客戶來個小小的壓力測試, 就發生了靈異現象,
前一頁 submit 之後, 下一頁沒有 show 出來, 整頁就是白白的

而 tomcat 的 stderr 出現了這個 exception :
java.lang.IllegalStateException: Cannot forward after response has been committed
翻譯成白話文就是 :
當 servlet 想要用 javax.servlet.RequestDispatcher.forward() 到結果頁的 jsp 時, 發現 response 早就結束掉了 @___@
這是什麻鬼呀, 不是大家都這樣寫的嗎 ...
因為在家裡並沒有看過這個錯誤 (this case),
一開始一直懷疑是不是 resource 不足導致
so, 請人家加了 cpu, 也加大了 jvm 的 heap size
~~ 還是沒改善 @_____@

source review 了一遍又一遍 ...
重點是 ~ 程式怎麻看就是那兩三支而已, 實在是變不出什其它花樣
正當已經走投無路, 完全找不到頭緒的時候

忽然間, 隔壁的同事說要幫我再問問 google 大神
(不知道是不是前一天晚上有跟上帝禱告說 ~ 請它幫個忙之類的緣故)
我給了它一個我正在懷疑的 keyword
結果它回了我一個八杆子打不著的網頁 : A bug in tomcat or Java2D

不過認真的看完之後,
發現它說的是 tomcat 在 servlet 操作 OutputStream 跟 ImageIO 時
有個小 bug 會引起上述 exception,
那 ~~~ 跟我們這 case 有關嗎 ??
我們有用到這什麻 ImageIO 嗎 ??
突然我想到我們有一個圖形驗證碼的功能 ~~
再加上另外一個案子也是偶爾出現這 exception, 一樣都找不到頭緒
"圖形驗證碼" 正是兩個案子的共通點,
馬上翻 code 出來看, 果然有用到 ImageIO
不過那人的說明沒清楚的寫出解法 ... 於是又請教了 google 大神
得到了這個指引 : tomcat wiki

馬上依指示服用 ....

後來經過反覆的測試, 也出動了 jmeter 進行壓測, exception 終於不在出現了
客戶那兒也重做了壓力測試, 總算平安過關結案 ...
(而且另外一個案子困擾已久的狀況也得到救贖 ~~ thx god !!)

希望這篇 memo 可以對其它人有所幫助, 真是天殺的 tomcat >____<