web-dev-qa-db-ja.com

HTTP接続のタイムアウトをグローバルに設定できますか?

_javax.xml.ws.Service_を使用してWSDLで定義されたリモートサービスを呼び出すプログラムがあります。このプログラムはGoogleApp Engineで実行され、デフォルトではHTTP接続のタイムアウトが_5_秒{1}に設定されます。このサービスは応答に時間がかかることが多いため、このタイムアウト値を増やす必要がありますが、このリクエストはURLConnectionで行われていないため、URLConnection.setReadTimeout(int) {2の呼び出し方法がわかりません。 }、またはその他の方法でタイムアウトを変更します。

App EngineでHTTP接続タイムアウトをグローバルに設定する方法はありますか?そして、知識を共有するために、この種の問題を一般的にどのように解決するのでしょうか。

{1}: https://developers.google.com/appengine/docs/Java/urlfetch/overview#Requests

{2}: http://docs.Oracle.com/javase/1.5.0/docs/api/Java/net/URLConnection.html#setReadTimeout(int)

17
Travis Webb

これを試して:

Port port = service.getPort(endPointInterface);  //or another "getPort(...)"
((BindingProvider) port).getRequestContext()
    .put(BindingProviderProperties.REQUEST_TIMEOUT, 30);
8
elias

文書化されているSun.net.client.defaultConnectTimeoutおよびSun.net.client.defaultReadTimeoutシステムプロパティの設定を試すことができます ここ 例:.

System.setProperty("Sun.net.client.defaultReadTimeout", "30000");
System.setProperty("Sun.net.client.defaultConnectTimeout", "30000");

[〜#〜]編集[〜#〜]

申し訳ありませんが、もう一度読んで、これがGoogle AppEngineにあることに気づきました。確かなことはわかりませんが、最近GoogleとOracleが訴訟関係にあることを考えると、GAEはOracleJVMを実行していないと思います。他の誰かが同様の問題に遭遇した場合に備えて、これをここに残しておきます。

14
Justin Garrick

https://developers.google.com/appengine/docs/Java/urlfetch/usingjavanet を参照してください

URLConnectionを取得するには、次のようにします。

    URL url = new URL("http://www.example.com/atom.xml");
    URLConnection tempConnection = url.openConnection();
    tempConnection.setReadTimeout(10);
4
iein valdez

JAX-WSを使用するAppEngineの場合、リクエストコンテキストを設定する必要があります(SDK 1.9.15で本日テスト済み)。通常のマシンの場合、60秒を超えることはできず、タスクキューをより適切に使用するには、より大きなマシン(Bx)に切り替える必要があります。

ローカルテストでは、通常、BindingProviderProperties.CONNECT_TIMEOUTとBindingProviderProperties.REQUEST_TIMEOUTを使用しますが、これらはApp Engine JREホワイトリストに含まれておらず、コード検査で常に警告が表示される場合があります。ただし、同等の文字列を使用できます。

com.Sun.xml.internal.ws.connect.timeout
com.Sun.xml.internal.ws.connect.timeout

App Engineにデプロイする場合:

com.Sun.xml.ws.connect.timeout
com.Sun.xml.ws.request.timeout

これをJAX-WS2.xから自動生成されたコードに適用する方法の完全な例では、値をミリ秒単位で指定する必要があります。

@WebEndpoint(name = "Your.RandomServicePort")
public YourServiceInterface getYourRandomServicePort() {
    YourRandomServiceInterface port = super.getPort(YOURRANDOMSERVICE_QNAME_PORT, YourRandomServiceInterface.class);
    Map<String, Object> requestContext = ((BindingProvider)port).getRequestContext();
    requestContext.put("com.Sun.xml.ws.connect.timeout", 10000);
    requestContext.put("com.Sun.xml.ws.request.timeout", 10000);
    return port;
}
1
Anton Kaiser