如何为JAX-WS WebService调用设置超时

San*_*nia 17 java jboss web-services jax-ws java-ee

我正在使用WebService Client,我想为我的WebService调用设置一个Timeout.我尝试了不同的方法,但我仍然无法做到这一点.我正在使用JAX-WS从WSDL生成代码.我使用JBoss-eap-5.1作为App Server和JDK1.6.0_27.我发现这些差异方法用于设置超时,但它们都不适用于我.

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.");
Run Code Online (Sandbox Code Playgroud)

现在我所做的是,我已经从执行者内部调用了我的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();
        }
Run Code Online (Sandbox Code Playgroud)

kol*_*sus 22

您可以尝试这些设置(它们配对成对使用)

BindingProviderProperties.REQUEST_TIMEOUT
BindingProviderProperties.CONNECT_TIMEOUT
Run Code Online (Sandbox Code Playgroud)

BindingProviderProperties 应该来自 com.sun.xml.internal.WS.client

或者JBoss的字符串:

javax.xml.ws.client.connectionTimeout
javax.xml.ws.client.receiveTimeout
Run Code Online (Sandbox Code Playgroud)

所有要放置的属性都以getRequestContext()毫秒为单位.

(BindingProvider)wsPort).getRequestContext().put(BindingProviderProperties.REQUEST_TIMEOUT, yourTimeoutInMillisec);
Run Code Online (Sandbox Code Playgroud)

对于JBoss,您可能希望使用StubExt.PROPERTY_CLIENT_TIMEOUT来自的属性org.jboss.ws.core.StubExt.有关详情,请参阅此主题.


use*_*395 7

就像kolossus说你应该使用:

com.sun.xml.internal.ws.client.BindingProviderProperties     
Run Code Online (Sandbox Code Playgroud)

和String值是:

com.sun.xml.internal.ws.connect.timeout
com.sun.xml.internal.ws.request.timeout
Run Code Online (Sandbox Code Playgroud)

虽然不应使用内部包,但如果使用默认JDK6,这是唯一的方法.因此,在这种情况下,设置接收和连接超时应该通过以下方式完成:

bindingProvider.getRequestContext().put(BindingProviderProperties.REQUEST_TIMEOUT,requestTimeoutMs);

bindingProvider.getRequestContext().put(BindingProviderProperties.CONNECT_TIMEOUT,connectTimeoutMs);
Run Code Online (Sandbox Code Playgroud)

但要注意,如果使用其他JAXWS参考实现,则常量值不同,即JAXWS-RT 2.1.4 BindingProviderProperties:

com.sun.xml.ws.client.BindingProviderProperties
Run Code Online (Sandbox Code Playgroud)

对于REQUEST_TIMEOUT和CONNECT_TIMEOUT,您将拥有不同的String值:

com.sun.xml.ws.request.timeout
com.sun.xml.ws.connect.timeout
Run Code Online (Sandbox Code Playgroud)


小智 5

对我来说,设置javax.xml.ws.client.connectionTimeoutjavax.xml.ws.client.receiveTimeout解决了问题。

((BindingProvider)port).getRequestContext().put("javax.xml.ws.client.connectionTimeout", timeout);
((BindingProvider)port).getRequestContext().put("javax.xml.ws.client.receiveTimeout", timeout);
Run Code Online (Sandbox Code Playgroud)

参考链接