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

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

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

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

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

您可能还希望使用此处描述的术语(并在此处起源)来更精确地讨论这一术语。

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

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

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

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

我想我会尝试通过提供有关我所做的进一步研究的更新来回答我自己的问题。 看来默认情况下,旧版本的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