【问题标题】:JAX-ws connection pulling and thread safetyJAX-ws 连接拉取和线程安全
【发布时间】:2015-09-18 21:19:10
【问题描述】:

我正在将一些 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));

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

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

【问题讨论】:

    标签: multithreading web-services jax-ws


    【解决方案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 PoolGenericObjectPool)来重用 CalculatorWs 的实例。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-07
      • 2011-05-22
      • 1970-01-01
      • 2017-11-11
      • 2012-05-22
      • 2013-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多