WebServiceクライアントで作業していて、WebServiceコールのタイムアウトを設定したいとします。私はさまざまなアプローチを試みましたが、それでも私はこれを達成することができません。 WSDLからのコード生成にJAX-WSを使用しています。私はJBoss-eap-5.1をApp ServerとJDK1.6.0_27として使用しています。私はタイムアウトを設定するためにこれらのdiffのアプローチを見つけましたが、どれも私のために働いていません。今私がやっていることについては JAX-WS WebServiceコールのタイムアウトを設定する方法
URL mbr_service_url = new URL(null,GlobalVars.MemberService_WSDL, new URLStreamHandler() {
@Override
protected URLConnection openConnection(URL url) throws IOException {
URL clone_url = new URL(url.toString());
HttpURLConnection clone_urlconnection = (HttpURLConnection) clone_url.openConnection();
// TimeOut settings
clone_urlconnection.setConnectTimeout(10000);
clone_urlconnection.setReadTimeout(10000);
return (clone_urlconnection);
}
});
MemberService service = new MemberService(mbr_service_url);
MemberPortType soap = service.getMemberPort();
ObjectFactory factory = new ObjectFactory();
MemberEligibilityWithEnrollmentSourceRequest request = factory.createMemberEligibilityWithEnrollmentSourceRequest();
request.setMemberId(GlobalVars.MemberId);
request.setEligibilityDate(value);
((BindingProvider) soap).getRequestContext().put(com.sun.xml.ws.client.BindingProviderProperties.REQUEST_TIMEOUT, 10000);
((BindingProvider) soap).getRequestContext().put(com.sun.xml.ws.client.BindingProviderProperties.CONNECT_TIMEOUT, 10000);
((BindingProvider) soap).getRequestContext().put(com.sun.xml.internal.ws.client.BindingProviderProperties.REQUEST_TIMEOUT, 10000);
((BindingProvider) soap).getRequestContext().put(com.sun.xml.internal.ws.client.BindingProviderProperties.CONNECT_TIMEOUT, 10000);
((BindingProvider) soap).getRequestContext().put(com.sun.xml.ws.developer.JAXWSProperties.REQUEST_TIMEOUT, 10000);
((BindingProvider) soap).getRequestContext().put(com.sun.xml.ws.developer.JAXWSProperties.CONNECT_TIMEOUT, 10000);
((BindingProvider) soap).getRequestContext().put(com.sun.xml.internal.ws.developer.JAXWSProperties.REQUEST_TIMEOUT, 10000);
((BindingProvider) soap).getRequestContext().put(com.sun.xml.internal.ws.developer.JAXWSProperties.CONNECT_TIMEOUT, 10000);
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
MemberEligibilityWithEnrollmentSourceResponse response = soap.getMemberEligibilityWithEnrollmentSource(request);
logger.log("Call to member service finished.");
は、私はエグゼキュータの中から自分のWebサービスメソッドを呼び出しています。私はそれが良いアプローチではなく、私のために働いていることを知っています。皆さん、私が適切な方法でそれをやるのを手伝ってください。
logger.log("Parameters set for createorUpdateContact call.\nGoing in Executor Service.");
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.execute(new Runnable() {
@Override
public void run() {
try {
response = soap.getMemberEligibilityWithEnrollmentSource(request);
} catch (MemberServiceException ex) {
logger.log("Exception in call to WebService", ex.fillInStackTrace());
}
}
});
executorService.shutdown();
try {
executorService.awaitTermination(GlobalVars.WSCallTimeOut, TimeUnit.SECONDS);
} catch (InterruptedException ex) {
logger.log("Thread Interrupted!", ex);
executorService.shutdownNow();
}
はStubExt.PROPERTY_CLIENT_TIMEOUTは私のために働いたが、例外がためだけ '3 * timeoutMillisecond' 後にスローされます。例:例外よりも 'timeoutMillisecond = 3000'が9000ミリ秒後にスローされるが、' Timeout after:3000ms'がログファイルに書き込まれる – mariami
ありがとう@mariamiそれは私のために働いた。 3 * timeoutMillisecondの後ではなく、適切な時に例外がスローされます。それを動作させるためには、jaxに関連するjboss libからいくつかのjarを削除しなければなりませんでした。それ以外の場合、NoClassDefFoundError:javax/xml/ws/spi/Provider21を与えていました。 –