1. 程式人生 > >org.apache.http.ConnectionClosedException: Premature end of Content-Length delimited message body

org.apache.http.ConnectionClosedException: Premature end of Content-Length delimited message body

傳送http請求給後端服務,在資料量大的時候報錯:

org.apache.http.ConnectionClosedException: Premature end of Content-Length delimited message body (expected: 144445481; received: 25370248)

意思是資料傳輸被提前終止了,期望傳輸144445481 B,只是傳輸了25370248 B。

http請求模型見上,在client用server的ip加埠訪問服務,即使資料量大也沒有問題。但是一旦通過域名訪問,也就是通過Nginx訪問,資料量大就會報上述錯誤。實際上是Nginx對響應結果做了限制,如果Nginx超時時間設定的較短,而buffer很大的情況下,可以修改Nginx超時時間,將時間調大,這樣在大資料量傳輸的過程中就不會因為超時而終止。如果Nginx超時時間足夠長,但是buffer較小的話,可以調大buffer來解決。

還有一點需要注意,就是同步非同步的問題可能會引發這個問題,比如:

method A{

    語句1;

    語句2(非同步呼叫其他資料庫查詢);

    語句3(finally塊關閉連線)

}

在上面的邏輯中,如果方法A是同步呼叫,但是資料庫查詢是非同步,可能的一種情況是:資料沒有傳輸完成,但是語句3已經執行了,連線被關閉,也可能引發上面的問題。