Java多重提交處理分析
現代網絡站點(web site)的主要任務是顯示動態內容。從某些角度看,就是指用戶將輸入信息發送給網絡應用(web application)進行處理之后網絡應用再將處理結果發送回用戶。某些特別情況下,從用戶角度看后端操作運行足夠快并且一切正常。但是在有些時候,后端的處理往往會因為出現較多的時間消耗而引起延遲。這種延遲有可能過長而最終使用戶認為是其自己的操作錯誤,他們也許會放棄當前的操作或重新提交請求。
處理操作運行周期的事件過長并不是一個新問題。Java提供的健壯的線程機制能夠建立起后臺的任務分配。另外,隨著EJB 2.0規范的出現,基于消息的EJB(簡稱MDB)能夠被用來執行后臺操作。不過請記住,這些機制是為了處理異步操作而設計的。從你啟動了一個線程或后臺處理,到某段時間之后你被通知或者是需要查看結果,整個過程完全是異步的。
對于輕型的長時間運行的一般同步應用仍然會引起大量處理的問題你有何看法?想象一下,一個音樂愛好者登陸她喜歡的網站為一場剛開始售票的演出訂票(我想起了最近Bruce Springsteen的演唱會)。在通常情況下,網站會很好的執行并且我們的音樂愛好者能夠以她自己的方式買到票。可是,當負載很大時,服務器便會慢下來,使該用戶的操作不能順利進行(用戶會以為自己的訂購操作失敗了),因此她會接二連三的點擊"提交"按鈕。不幸的是,每一次點擊"提交"都把之前的訂票操作中止了。
有很多方法處理這種情況。最顯而易見的方法是防止用戶重復提交相同請求。另外也可以跟蹤用戶先前提交的請求并回復先前的提交動作。下圖顯示了一個簡單的服務端小程序(servlet)的輸出數據,該程序處理每一個收到的請求,為每一個請求分配一個票號。
處理簡單的提交任務
圖1:簡單提交任務處理
[ 相關貼圖 ]

最主要和最有效解決多重提交問題的方法就是防止這種情況發生。下面列出的HTML程序ConcertTickets.html是一個簡單的表單,用于獲取由用戶輸入的音樂會名字并提交給服務端小程序(servlet)訂票。當網站相應迅速時處理執行的很好。但是,如果網站處于性能很低的狀態并且提交的任務處理不夠快,用戶認為失敗后會重新提交。處理過程在表1下的圖2中顯示。
表1:ConcertTickets.html
01: <html> 02: <head><title>Online Concert Tickets</title></head> 03: 04: <center><h1>Order Tickets</h1></center> 05: 06: <form name="Order" action="./SimpleOrder" method="GET"> 07: <table border="2" width="50%" align="center" bgcolor="CCCCCC"> 08: <tr><td align="right" width="40%">Concert: </td> 09: <td width="60%"><input type="text" name="Concert" value=""></td></tr> 10: 11: <tr><td colspan="2" align="center"> 12: <input type="submit" name="btnSubmit" 13: value="Do Submit"></td></tr> 14: </table> 15: </form> 16: </body> 17: </html> |
圖2:重復的任務提交
[ 相關貼圖 ]
