_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)
これを試して:
Port port = service.getPort(endPointInterface); //or another "getPort(...)"
((BindingProvider) port).getRequestContext()
.put(BindingProviderProperties.REQUEST_TIMEOUT, 30);
文書化されている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を実行していないと思います。他の誰かが同様の問題に遭遇した場合に備えて、これをここに残しておきます。
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);
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;
}