【问题标题】:Are CXF client proxies thread safe?CXF 客户端代理线程安全吗?
【发布时间】:2012-10-30 09:36:45
【问题描述】:

我正在使用 CXF 生成 SOAP 客户端类。在CXF documentation,他们写道

JAX-WS 客户端代理线程安全吗?

官方 JAX-WS 回答:不。根据 JAX-WS 规范,客户端代理不是线程安全的。要编写可移植代码,您应该将它们视为非线程安全并同步访问或使用实例池或类似的。

CXF 回答:CXF 代理对于许多用例来说都是线程安全的。例外情况是:

(我省略了他们对这些用例的描述)

对于大多数“简单”用例,您可以在多个线程上使用 CXF 代理。以上概述了其他人的解决方法。

有没有人有相反的经历?遇到了常见问题解答中未描述的多线程问题?或者它们的描述是否准确,它们基本上可以安全使用?

【问题讨论】:

  • 这到底是什么意思?这是否意味着由 CXF wsdl2java 生成的客户端代理(大部分)是线程安全的,还是您需要在客户端程序中使用任何实际的 CXF API?
  • @MaartenBoekhold 我的意思是生成的客户端代理。

标签: multithreading soap client cxf proxy-classes


【解决方案1】:

我们最近在我们的项目中遇到了类似的讨论。 如您所指的常见问题解答中所述,除了动态修改 HTTP 管道的功能(例如:会话管理和故障转移功能),CXF 客户端代理是线程安全的。 因此,如果您不使用这些功能,则可以在线程之间共享客户端代理。

【讨论】:

    【解决方案2】:

    您可能指的是运行时,但我不认为配置时间是线程安全的。我相信我在 JettyHTTPServerEngineFactory 中看到了竞争条件。

    在测试工具中,我们启动了多个不相关的 SOAP 服务器,当它们共享总线时,如果多个线程尝试同时添加 JettyHTTPServerEngine 实例,则可能会出现竞争情况。具体的竞争条件在 setTLSServerParametersForPort() 中,当您想对端口使用 HTTPS 时调用它。该方法将元素添加到没有锁定的 HashMap。

    我猜其他人没有遇到这种情况的原因是大多数人通过配置文件配置CXF,一个进程中很少有多个端口/Jetty服务器。

    【讨论】:

    • 事实证明,更新版本的 CXF 修复了这种特殊的竞争条件,但我还没有在 CXF 的文档中看到关于线程的明确合同。此外,地图是静态的,因此旧版本中的竞态条件与总线无关。
    猜你喜欢
    • 1970-01-01
    • 2019-03-20
    • 2011-05-22
    • 1970-01-01
    • 2013-08-07
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    相关资源
    最近更新 更多