Как установить тайм-аут для вызова 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\