GAEでunexpected end of stream error
AndroidのサービスからGAEに接続するコードを書いていたところ、たまに次のエラーが出ました。
11-18 20:54:44.998: W/System.err(5527): java.io.IOException: unexpected end of stream
11-18 20:54:44.998: W/System.err(5527): at libcore.net.http.FixedLengthOutputStream.close(FixedLengthOutputStream.java:58)
11-18 20:54:44.998: W/System.err(5527): at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:81)
11-18 20:54:44.998: W/System.err(5527): at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:965)
11-18 20:54:45.008: W/System.err(5527): at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:410)
11-18 20:54:45.008: W/System.err(5527): at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:343)
11-18 20:54:45.008: W/System.err(5527): at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:460)
Stackoverflowで調べてみると、明確な回答はなかったのですが、
http://stackoverflow.com/questions/16410456/google-cloud-endpoint-keeps-throwing-unexpected-end-of-stream-exception
のコメントに、
result.getRequestHeaders().set("connection", "close");
を追加すれば解消される、といったことが書いてありました。
そこで、EclipseのGoogle Pluginで自動生成されたClient Endpointライブラリのソースコード
endpoints-libs/libxxxendpoint-v1/xxxendpoint/xxxendpoint-v1-generated-source
以下の、
Xxxendpoint.java
ファイルを開き、該当するEndpointのメソッド、例えば
public SaveXxxData saveUnifiedData(com.example.sample.xxxendpoint.model.XxxData content) throws java.io.IOException {
SaveXxxData result = new SaveXxxData(content);
initialize(result);
return result;
}
を
public SaveXxxData saveUnifiedData(com.example.sample.xxxendpoint.model.XxxData content) throws java.io.IOException {
SaveXxxData result = new SaveXxxData(content);
result.getRequestHeaders().set("connection", "close");
initialize(result);
return result;
}
のように修正すれば、確かに、エラーが出なくなりました。
しばらくは、これで様子をみようと思います。
==> しばらくはよかったのですが、やはりエラーが出るようになりました。
をみると、
System.setProperty("http.keepAlive", "false");
を設定すればよいようです。