Multithreading JAX-ws连接拉取和线程安全
我正在将一些JAX-WS调用与一些遗留代码集成, 旧代码在加载时创建类的单个实例。(我将在这个单实例类中实现web服务调用) 鉴于此: 据我所知,[Service]是线程安全的,而代理[CalculatorWs]不是线程安全的,这是正确的吗?Multithreading JAX-ws连接拉取和线程安全,multithreading,web-services,jax-ws,Multithreading,Web Services,Jax Ws,我正在将一些JAX-WS调用与一些遗留代码集成, 旧代码在加载时创建类的单个实例。(我将在这个单实例类中实现web服务调用) 鉴于此: 据我所知,[Service]是线程安全的,而代理[CalculatorWs]不是线程安全的,这是正确的吗? 处理来自遗留系统的多个请求并进行web服务调用的正确方法是什么 我应该创建一个连接池来获取现有的[CalculatorWs]对象,还是从池中同时获取[CalculatorWs]对象和[Service]对象?如果您使用的是JAX-WS实现,您可以添加这个特定
处理来自遗留系统的多个请求并进行web服务调用的正确方法是什么 我应该创建一个连接池来获取现有的[CalculatorWs]对象,还是从池中同时获取[CalculatorWs]对象和[Service]对象?如果您使用的是JAX-WS实现,您可以添加这个特定于CXF的请求上下文属性,以强制它对出站请求是线程安全的。CXF的文档说明响应上下文是自动线程安全的
Service calculatorService = Service.create(
new URL("http://127.0.0.1:4204/Calculator?wsdl"),
new QName("http://superbiz.org/wsdl", "CalculatorService"));
CalculatorWs calculator = calculatorService.getPort(CalculatorWs.class);
//per CXF docs, custom request property ensures request context is threadsafe. Response context is already so.
((BindingProvider)calculator).getRequestContext().put("thread.local.request.context", "true");
calculator.sum(4, 6));
如果您正在使用而不是使用CXF(或希望编写可移植代码),则可能需要使用诸如的对象池来重用CalculatorWs
的实例
在本例中,您将使用对象工厂并实现(BasePooledObjectFactory
)的子类,该子类实现了create()
,以使用与类似的calculatorService.getPort(CalculatorWs.class)
调用。它是CalculatorWs
的实例,在已知的多线程场景中,您需要小心使用它
Service calculatorService = Service.create(
new URL("http://127.0.0.1:4204/Calculator?wsdl"),
new QName("http://superbiz.org/wsdl", "CalculatorService"));
CalculatorWs calculator = calculatorService.getPort(CalculatorWs.class);
//per CXF docs, custom request property ensures request context is threadsafe. Response context is already so.
((BindingProvider)calculator).getRequestContext().put("thread.local.request.context", "true");
calculator.sum(4, 6));