2012-10-30 39 views
6

我正在使用CXF来生成SOAP客户端类。在CXF documentation中,他们写出CXF客户端代理是否线程安全?

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

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

CXF答案:CXF代理对于很多用例都是线程安全的。唯一的例外是:

(我省略了这些用例描述)

对于最“简单”的使用情况,您可以在多线程使用CXF代理。以上概述了其他方法的解决方法。

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

+0

这是什么意思?这是否意味着由CXF'wsdl2java' **生成的客户端代理**(主要)是线程安全的,还是您需要在您的客户端程序中使用任何实际的CXF API? –

+0

@MaartenBoekhold我的意思是生成的客户端代理。 – Eyal

回答

6

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

1

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

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

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

+0

事实证明CXF的更新版本修复了这种特殊的竞争条件,但我还没有看到CXF文档中线程的最终合同。此外,地图是静态的,所以不管总线如何,旧版本的竞争条件都会发生。 –