2010-12-08 34 views
3

メトロ2.0とJ2SE5を使用しています。私が書いたアプリケーションは、コンパイル時に外部WebServiceについて知りませんでした。ビジネスロジックXMLファイルに基づいて実行時にそれらを見つけます。したがって、私はWSDL要求を実行します。JAXWS - 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(リクエスト))が呼び出されたときにタイムアウトが正しく動作

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

WSDLが要求される前にタイムアウトを設定することはできますか?タイムアウトを設定するにはディスパッチャが必要ですが、WSDLを要求するサービスが作成された後に完了しますか? (すなわち。Service.create())

答えて

1

sun.net.client.defaultConnectTimeout 

設定システムのプロパティを試したがNetworking Propertiesから、それは私がキャッシュに示唆しているが、それは将来のリリースで

のためにサポートされない可能性が語りますWSDLにアクセスし、リモートからアクセスしません。
頻繁に変更されることが予想されないWSDLを使用して作業している場合は、特にパフォーマンスが向上します。

+0

こんにちは。あなたのコメントをありがとう、私はそれを試してみましょう。 WSDLが要求される前にws-timeoutsを設定するために自分のプログラムを変更できるかどうか分かりませんか?私はこれが可能であるべきだと思ったでしょうか? – Alex

+0

@Alex:WSDLは 'Service.create(new URL(wsdlURL)、serviceName);'でアクセスされていると思います。タイムアウトの設定はディスパッチャ上にあるので、以前はどのように設定できるかわかりません。しかし、jax-wsはサーバーとの通信のためのカバーの下でHttpUrlConnectionを使用するので、システムのプロパティは役立ちます。 IMHOあなたはリモートフェッチを避けるためにキャッシュされたwsdlを保つべきですが、これらの種類の問題も避けてください。 – Cratylus

+0

@Alex:これを確認してくださいhttp://mail-archives.apache.org/mod_mbox/cxf-users/200902.mbox/%[email protected]%3E – Cratylus

1

私たちはこの同じ問題に遭遇し、上記のすべての設定を試しました。同様に、無駄になりません。

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

この方法では、明示的にタイムアウトを制御しながら、現在のWSDLを動的に取得できます。その後、元の投稿に表示されるように、サービスへの後続のコールのタイムアウトを設定します。

+0

XSDはどうですか?ダウンロードしたWSDLはXSDを指します。 JAX-WS RI(別名Metro)はこれもダウンロードしようとしますか? – peterh

+0

私は確信していません(これを見てから数年経ちました)が、おそらく指定された(より長い)タイムアウトがその時点で使用されています。私が知っていることは、これが問題を解決したということです。 :) –

+0

私は、JAX-WS RIが実行時に必要とするメタデータを実際に知っている人がいますか? .wsdlファイルを保持しようとするだけか、.xsdファイルを保持しようとしますか? .wsdlファイルには.xsdファイルへのリンクがあります。 JAX-WS RIがサーバーから.xsdファイルを要求しているのを見たことがあります(ただし、「通常の」ケースでは発生しません)。言い換えれば、ある日、JAX-WS RIが突然** ** .xsdファイルを保持しようとしたために解決策が破綻する可能性があります。 (これの一部は投機的です) – peterh

関連する問題