【问题标题】:Set synchronous timeout for client from JaxWsProxyFactoryBean从 JaxWsProxyFactoryBean 为客户端设置同步超时
【发布时间】:2021-02-01 12:02:52
【问题描述】:

我的 (spring boot) API 中存在一个问题,它调用的 SOAP 服务有时会花费一分钟以上的时间来响应,从而导致 SocketTimeoutException。经过大量搜索,我将原因缩小到这段代码:

    @SuppressWarnings("unchecked")
    public <T> T createWsService(Class<T> serviceClass, String url) {
        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
        factory.setServiceClass(serviceClass);
        factory.setAddress(url);

        LoggingInInterceptor loggingInInterceptor = new LoggingInInterceptor();
        loggingInInterceptor.setPrettyLogging(true);
        factory.getInInterceptors().add(loggingInInterceptor);

        LoggingOutInterceptor loggingOutInterceptor = new LoggingOutInterceptor();
        loggingOutInterceptor.setPrettyLogging(true);
        factory.getOutInterceptors().add(loggingOutInterceptor);

        return (T) factory.create();
    }

通过调试时,我可以看到 factory.create() 返回一个代理对象,但这是从 ws 供应商转换到接口的。代理对象包含一个ClientImpl,我可以看到它的默认同步超时时间为 60000(一分钟)。

我尝试添加以下内容:

        Map<String, Object> properties = new HashMap<>();
        properties.put("cxf.synchronous.timeout", 1);
        factory.setProperties(properties);

设置属性(使用 1 作为测试来检查它是否有效)但这只是将属性设置为容器对象的端点。接口上没有我需要使用的方法来设置任何属性。

我还尝试将返回的对象强制转换为 JaxWsClientProxy 以自行设置,但这不起作用,尽管它在调试时显示为该结构。

如何在这里增加超时?如果需要的话,我愿意放弃 JaxWsProxyFactoryBean 方法,转而采用更灵活的方法,但如果可能的话,我更愿意将更改保持在最低限度。

【问题讨论】:

    标签: java spring-boot jax-ws


    【解决方案1】:

    我想我找到了,我需要的属性是 "javax.xml.ws.client.receiveTimeout" 而不是 "cxf.synchronous.timeout"

    【讨论】:

      猜你喜欢
      • 2013-07-16
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      • 2011-07-11
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多