只能說自己平時太粗心了,一些細節問題雖然幾次路過,都沒有注意過,也沒有好好想過.
同事負責的一段微信模塊的小邏輯,為了防止微信服務器認為沒有接收到請求而重發消息,所以再收到微信服務器發回的消息后,馬上用response.getwriter()方法寫回一個success消息,在這個方法后開始執行費時的業務邏輯.這個看起來好像沒問題,邏輯上好像也ok,但是實際執行的效果卻是,response.getwriter()方法雖然執行了,但是並沒有及時將數據返回給微信服務器,而是等到之后的代碼全都執行完了才真正返回數據.
當然解決這個問題的方法多得是,簡單的方式業務邏輯直接新起個線程任務執行就好了.但這不是這里討論的重點.問題是為何這個response.getwriter()方法寫回的數據沒有及時返回呢?
簡單回顧一下servlet的執行流程:
Web瀏覽器-->發出http請求-->Web容器(首次訪問的話創建目標Servlet對象)-->創建請求和響應對象(request和response)
-->調用Servlet的service(ServletResquest,ServletRespons)並且將剛才創建的請求對象和響應對象對象傳遞給Servlet
-->Servlet程序從請求對象中讀取請求信息,將響應信息寫入到響應對象當中-->service方法結束,程序返回到web容器
->web容器從相應對象中讀取響應信息
->將響應星系生成HTTP消息返回給瀏覽器
重點在於紅字和綠字的部分,簡單的說我們的請求和返回依賴的是請求和返回對象,在請求和返回對象沒有返回的情況下,實際容器並沒有收到我們返回的任何信息.而從servlet的執行流程中也能看出來,實際上請求和響應對象是在servlet的service()方法執行結束后,將所有的請求和返回信息都封裝進請求和響應對象中后,才返回給web容器,web容器從這些對象中讀取數據才返回給請求方.所以response.getWriter()寫回的數據也是僅僅是寫入response對象中,在response對象沒有真正返回的時候,請求方是接收不到我們的返回信息的.
整理一下servlet流程,這個問題就很好理解了,但是如果沒好好想一想,卻很容易成為一個當想然的錯誤理解..