我的(spring boot)应用程序接口中有一个问题,它调用的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方法,转而采用更灵活的方法,但如果可能的话,我更愿意将更改保持在最低限度。
发布于 2021-02-01 23:41:40
我想我已经找到了,我需要的属性是"javax.xml.ws.client.receiveTimeout"
而不是"cxf.synchronous.timeout"
https://stackoverflow.com/questions/65992397
复制相似问题