Axis2生成的存根是否是线程安全的?

时间:2009-12-23 00:35:13

标签: java web-services multithreading thread-safety axis2

是否通过Axis2线程安全从WSDL生成客户端存根?

当然,“线程安全”不一定是一个严格定义的术语,所以我至少对以下内容感兴趣:

同一存根类的不同的实例是否可由不同的线程同时访问,具有与单线程执行相同的有效行为?

同一存根类的单个实例是否可由不同的线程同时访问,其效果与在单线程执行中以某种任意方式交错的相同调用相同?

您可能还希望使用here(和原始here)描述的术语来更精确地讨论这个术语。

3 个答案:

答案 0 :(得分:17)

我不确定axis2,但至少axis1生成非线程安全的客户端存根。我得到的印象几乎所有其他SOAP客户端也是非线程安全的。如果我没记错的话,问题在于客户端存根以非线程安全的方式使用XML解析库。

使用apache commons-pooling来汇集实例并且一次使用一个线程中的每个实例都运行良好。

更新:对于Axis2,请参阅https://issues.apache.org/jira/browse/AXIS2-4357(声称Axis2不是线程安全的,按设计)

答案 1 :(得分:2)

这些存根是无状态的,允许重用存根实例。能否请您详细说明Axis2面临的问题。人们通常建议Xfire超过Axis。

答案 2 :(得分:1)

我想我会尝试通过提供有关我所做的进一步研究的更新来回答我自己的问题。看来默认情况下,旧版本的Axis2存根可能只是“线程兼容”(不能同时从多个线程调用同一个存根实例 - 但调用不同的实例是正常的。)

参见例如:

http://markmail.org/message/3lu7x7pfo47vgnck http://markmail.org/message/sljyf6lpecxqllgx

如果你没有调用cleanup / cleanupTransport,你可能会遇到一些套接字泄漏,并且因为这个线程和许多相关的线程而没有调用套接字:

http://issues.apache.org/jira/browse/AXIS2-3670

在某些情况下,至少底层的HttpClient现在似乎是线程安全的,但根据您生成客户端的方式,整个存根可能不是:

http://amilachinthaka.blogspot.com/2009/05/improving-axis2-client-http-transport.html