我正在使用CXF生成SOAP客户端类。在CXF documentation中,他们写了
JAX-WS客户端代理线程是否安全?
官方JAX-WS答案:不可以。根据JAX-WS规范,客户端代理不是线程安全的。要编写可移植代码,您应该将它们视为非线程安全并同步访问或使用实例池或类似代码。
CXF回答:对于许多用例,CXF代理是线程安全的。例外情况是:
(我省略了对这些用例的描述)
对于大多数“简单”用例,您可以在多个线程上使用CXF代理。以上概述了其他人的解决方法。
有没有人有相反的经历?遇到了faq中没有描述的多线程问题?或者他们的描述是否准确,他们基本上可以安全使用?
答案 0 :(得分:6)
我们最近在我们的项目中遇到了类似的讨论。 正如您所指的FAQ中所指定的,除了动态修改HTTP管道的功能(例如:会话管理和故障转移功能)之外,CXF客户端代理是线程安全的。 因此,如果您不使用这些功能,那么可以在线程之间共享客户端代理。
答案 1 :(得分:1)
你可能指的是运行时,但我不认为配置时间是线程安全的。我相信我在JettyHTTPServerEngineFactory中看到了竞争条件。
在测试工具中,我们会调出多个不相关的SOAP服务器,当它们共享总线时,如果多个线程同时尝试添加JettyHTTPServerEngine实例,则可能存在竞争条件。特定竞争条件位于setTLSServerParametersForPort()中,当您要将HTTPS用于端口时,可以调用该条件。该方法将元素添加到没有锁定的HashMap。
我想其他人不会遇到这种情况的原因是,大多数人都是通过配置文件配置CXF,并且在一个进程中很少有多个端口/ Jetty服务器。