Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading JAX-ws连接拉取和线程安全_Multithreading_Web Services_Jax Ws - Fatal编程技术网

Multithreading JAX-ws连接拉取和线程安全

Multithreading JAX-ws连接拉取和线程安全,multithreading,web-services,jax-ws,Multithreading,Web Services,Jax Ws,我正在将一些JAX-WS调用与一些遗留代码集成, 旧代码在加载时创建类的单个实例。(我将在这个单实例类中实现web服务调用) 鉴于此: 据我所知,[Service]是线程安全的,而代理[CalculatorWs]不是线程安全的,这是正确的吗? 处理来自遗留系统的多个请求并进行web服务调用的正确方法是什么 我应该创建一个连接池来获取现有的[CalculatorWs]对象,还是从池中同时获取[CalculatorWs]对象和[Service]对象?如果您使用的是JAX-WS实现,您可以添加这个特定

我正在将一些JAX-WS调用与一些遗留代码集成, 旧代码在加载时创建类的单个实例。(我将在这个单实例类中实现web服务调用)

鉴于此:

据我所知,[Service]是线程安全的,而代理[CalculatorWs]不是线程安全的,这是正确的吗?
处理来自遗留系统的多个请求并进行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));