Pracuję nad klientem WebService i chcę ustawić limit czasu dla mojego wywołania WebService. Próbowałem różnych podejść, ale nadal nie jestem w stanie tego osiągnąć. Używam JAX-WS do generowania kodu z WSDL. Używam JBoss-eap-5.1 jako App Server i JDK1.6.0_27. Znalazłem te różne podejścia do ustawiania limitu czasu, ale żaden z nich nie działa dla mnie.Jak ustawić limit czasu dla JAX-WS WebService Zadzwoń
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.");
Na razie co mam zrobić jest, nazwałem moją metodę webservices od wewnątrz wykonawca. Wiem, że to nie jest dobre podejście, ale działa dla mnie. Faceci, proszę, pomóż mi to zrobić we właściwy sposób.
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 pracował dla mnie, ale jest wyjątek tylko po '3 * Dla timeoutMillisecond' przykład: Jeśli 'timeoutMillisecond = 3000' niż wyjątek jest generowany po 9000 milisekundach, ale' Timeout after: 3000ms' jest zapisany w pliku dziennika – mariami
Dzięki @mariami To działało dla mnie. Wyjątkiem jest wyrzucanie we właściwym czasie, a nie po 3 * timeoutMillisecond. Chociaż aby to zadziałało, musiałem usunąć niektóre słoiki z biblioteki jboss związane z jax, inaczej dawało NoClassDefFoundError: javax/xml/ws/spi/Provider21. –