JAX-ws连接拉动和螺纹安全

时间:2015-09-18 21:19:10

标签: multithreading web-services jax-ws

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

鉴于此sample JAX-WS usage code

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);
calculator.sum(4, 6));

据我所知[服务]是线程安全虽然代理[CalculatorWs]不是线程安全的,这是正确的吗? 处理来自遗留系统的多个请求并进行Web服务调用的正确方法是什么?

我应该创建一个连接池来获取现有的[CalculatorWs]对象还是从池中获取[CalculatorWs]对象和[Service]对象?

1 个答案:

答案 0 :(得分:1)

如果您使用Apache CXF作为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(或希望编写可移植代码),则可能需要使用Apache Commons Pool' s GenericObjectPool之类的对象池来重用{{{}的实例。 1}}。

在这种情况下,您将使用对象工厂并实现BasePooledObjectFactory(实际为CalculatorWs)的子类,该子类实现BasePooledObjectFactory<CalculatorWs>以使用您的create()调用类似于this example。它是calculatorService.getPort(CalculatorWs.class)的实例,您需要在已知的多线程场景中小心。