Как установить тайм-аут для вызова JAX-WS WebService
Я работаю над клиентом WebService, и я хочу установить Timeout для своего WebService Call. Я пробовал разные подходы, но все же я не могу этого добиться. Я использую JAX-WS для генерации кода из WSDL. Я использую JBoss-eap-5.1 в качестве сервера приложений и JDK1.6.0_27. Я нашел эти подходы diff для установки таймаута, но ни один из них не работает для меня.
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.");
Теперь, что я сделал, я вызвал мой метод webservice внутри исполнителя. Я знаю, что это не очень хороший подход, но он работает на меня. Ребята, пожалуйста, помогите мне сделать это надлежащим образом.
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();
}
Ответы
Ответ 1
Вы можете попробовать эти настройки (они сопряжены для использования в парах)
BindingProviderProperties.REQUEST_TIMEOUT
BindingProviderProperties.CONNECT_TIMEOUT
BindingProviderProperties
должен быть от com.sun.xml.internal.WS.client
Или строки для JBoss:
javax.xml.ws.client.connectionTimeout
javax.xml.ws.client.receiveTimeout
Все свойства, которые нужно поместить на getRequestContext()
в миллисекундах.
(BindingProvider)wsPort).getRequestContext().put(BindingProviderProperties.REQUEST_TIMEOUT, yourTimeoutInMillisec);
Для JBoss специально вы можете использовать свойство StubExt.PROPERTY_CLIENT_TIMEOUT
из org.jboss.ws.core.StubExt
. Подробнее см. этот поток.
Ответ 2
Как и kolossus, вы должны использовать:
com.sun.xml.internal.ws.client.BindingProviderProperties
И значения String:
com.sun.xml.internal.ws.connect.timeout
com.sun.xml.internal.ws.request.timeout
Хотя внутренние пакеты не должны использоваться, это единственный способ, если вы работаете с JDK6 по умолчанию. Таким образом, в этом случае установка времени приема и подключения должна выполняться с помощью:
bindingProvider.getRequestContext().put(BindingProviderProperties.REQUEST_TIMEOUT,requestTimeoutMs);
bindingProvider.getRequestContext().put(BindingProviderProperties.CONNECT_TIMEOUT,connectTimeoutMs);
Но будьте осторожны, постоянные значения разные, если вы используете другую ссылочную реализацию JAXWS, то есть JAXWS-RT 2.1.4 BindingProviderProperties:
com.sun.xml.ws.client.BindingProviderProperties
у вас будут разные значения String для REQUEST_TIMEOUT и CONNECT_TIMEOUT:
com.sun.xml.ws.request.timeout
com.sun.xml.ws.connect.timeout
Ответ 3
Для меня настройка javax.xml.ws.client.connectionTimeout
и javax.xml.ws.client.receiveTimeout
решена.
((BindingProvider)port).getRequestContext().put("javax.xml.ws.client.connectionTimeout", timeout);
((BindingProvider)port).getRequestContext().put("javax.xml.ws.client.receiveTimeout", timeout);
обратитесь ссылка
Ответ 4
Обновите jbossws-родную библиотеку и используйте StubExt.PROPERTY_CLIENT_TIMEOUT
Для обновления jbossws-native выполните следующую ссылку .
* jbossws-native-3.4.0 - последняя поддерживаемая версия для Jboss 5.1.0GA. Вы можете видеть JBossWS - Поддерживаемые контейнерные контейнеры
Это сработало для меня
Ответ 5
Установка для меня следующих параметров. Я использую реализацию Metro JAXWS.
((BindingProvider)portType).getRequestContext().put(JAXWSProperties.CONNECT_TIMEOUT, 10000);
((BindingProvider) portType).getRequestContext().put(JAXWSProperties.REQUEST_TIMEOUT, 50000);
portType - это интерфейс конечной точки веб-службы.
Значения вышеуказанных полей из com.sun.xml.internal.ws.developer.JAXWSProperties
public static final java.lang.String CONNECT_TIMEOUT = "com.sun.xml.internal.ws.connect.timeout";
public static final java.lang.String REQUEST_TIMEOUT = "com.sun.xml.internal.ws.request.timeout";
Ответ 6
У меня есть старая среда выполнения установки с такой средой: Jdk-1.5, Jboss-4.2.3.GA и WSClient был создан по спецификации JAX-WS 2.0.
чтобы активировать время ожидания запроса на мыло, я использую следующий код ((BindingProvider)port).getRequestContext().put(org.jboss.ws.core.StubExt.PROPERTY_CLIENT_TIMEOUT, String.valueOf(readTimeout));
и jar jbossws-client.jar
скопированный в jboss-4.2.3.GA\server\default\lib\