5

Metro2.0とJ2SE5を使用しています。私が作成したアプリケーションは、コンパイル時に外部WebServiceについて認識していません。実行時に、ビジネスロジックXMLファイルに基づいて外部Webサービスを検出するため、WSDL要求を実行します。

私が書いたサンプルコードは次のとおりです。

String wsdlServiceName = ...; String wsdlURL = ...; Document payload = ...;

final String nsURI = ...;
final QName serviceName = new QName(nsURI, wsdlServiceName + "Service");
final QName servicePort = new QName(nsURI, wsdlServiceName + "Port");

// Create service and the dispatcher for the SOAP message
Service service = Service.create(new URL(wsdlURL), serviceName);
dispatch = service.createDispatch(servicePort, SOAPMessage.class, Service.Mode.MESSAGE);

// Set timeouts
dispatch.getRequestContext().put("com.sun.xml.internal.ws.request.timeout", 3000);
dispatch.getRequestContext().put("com.sun.xml.internal.ws.connect.timeout", 3000);

// Create the outgoing SOAP request
SOAPBinding soapBinding = (SOAPBinding) dispatch.getBinding();
request = soapBinding.getMessageFactory().createMessage();

SOAPBody requestBody = request.getSOAPBody();
requestBody.addDocument(payload);

// Invoke web service operation 
SOAPMessage response = dispatch.invoke(request);

Webサービスが呼び出されると、タイムアウトは正しく機能します(dispatcher.invoke(request))

ただし、タイムアウトが設定される前にWSDLが要求され、Webサービスが応答しない場合は、接続がタイムアウトになるまでに90秒かかります。

WSDLが要求される前にタイムアウトを設定することは可能ですか?タイムアウトを設定するにはディスパッチャが必要ですが、WSDLを要求するサービスが作成された後に実行されますか?!(つまり、Service.create())

4

2 に答える 2

3

システムプロパティの設定を試す

sun.net.client.defaultConnectTimeout 

ただし、ネットワーク プロパティからは、将来のリリースではサポートされない可能性があると表示されています

ただし、WSDL をキャッシュし、リモートでアクセスしないことをお勧めします。
特に、頻繁に変更されることが予想されない WSDL を使用している場合は、パフォーマンスが向上します。

于 2010-12-08T13:52:19.710 に答える
2

この同じ問題に遭遇し、上記のすべての設定を試しましたが、同様に役に立ちませんでした.

私たちの解決策は、まず URL.openConnection() を使用して WSDL を一時ファイルにダウンロードすることでした (URLConnection.setConnectionTimeout() および URLConnection.setReadTimeout() を使用して接続のタイムアウトを設定します)。次に、File.toURI().toURL() を使用してこのファイルの URL を生成します。これは、URL を受け取るサービス コンストラクターに渡します。

このアプローチにより、タイムアウトを明示的に制御しながら、現在の WSDL を動的に取得できます。次に、元の投稿で示したように、サービスへの後続の呼び出しのタイムアウトを設定します。

于 2011-02-11T22:30:55.173 に答える