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

标签 java web-services jakarta-ee jboss jax-ws

我正在开发一个 WebService 客户端,我想为我的 WebService 调用设置一个超时。我尝试了不同的方法,但仍然无法实现。我正在使用 JAX-WS 从 WSDL 生成代码。我使用 JBoss-eap-5.1 作为应用服务器和 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.");

现在我所做的是,我从执行程序内部调用了我的网络服务方法。我知道这不是一个好方法,但它对我有用。伙计们请帮助我以正确的方式做到这一点。

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();
        }

最佳答案

你可以试试这些设置(它们是成对使用的)

BindingProviderProperties.REQUEST_TIMEOUT
BindingProviderProperties.CONNECT_TIMEOUT

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

或者字符串 for JBoss :

javax.xml.ws.client.connectionTimeout
javax.xml.ws.client.receiveTimeout

要在 getRequestContext() 上放置的所有属性(以毫秒为单位)。

(BindingProvider)wsPort).getRequestContext().put(BindingProviderProperties.REQUEST_TIMEOUT, yourTimeoutInMillisec);

具体对于 JBoss,您可能希望使用 org.jboss.ws.core.StubExt 中的属性 StubExt.PROPERTY_CLIENT_TIMEOUT。参见 this thread了解详情。

关于java - 如何为 JAX-WS WebService 调用设置超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13967069/

相关文章:

jakarta-ee - 未找到 JEE6 教程示例

Java:如何与机器通信?

java - 如何在stratus中显示服务器目录之外的图像

java - 如何使用javascript在输入类型文件中设置默认值?

java - 计算多维数组中的字符数,Java

java - 如何从Web服务器动态获取数据?

.NET Web 服务开发方法

java - 如何从网页下载Java小程序?

java - 如何解决 ElementcompilerArgs is not allowed here Maven 编译器插件错误?

php - 将数据从 C++ exe 返回到 web