19

Axis2 从 WSDL 生成的客户端存根是线程安全的吗?

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

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

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

您可能还希望使用此处描述的术语(以及源自此处)来更准确地讨论这个问题。

4

3 回答 3

21

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

使用 apache commons-pooling 来池化实例并一次使用一个线程中的每个实例效果很好。

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

于 2010-01-01T21:49:14.347 回答
3

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

于 2010-01-11T19:23:06.177 回答
2

这些存根是无状态的,允许重用存根实例。您能否详细说明您在使用 Axis2 时遇到的问题。人们通常推荐 Xfire 而不是 Axis。

于 2009-12-28T06:10:56.473 回答