Axis2 生成的短截线是否具有螺纹安全性?

由 Axis2 从 WSDL 生成的客户端存根是否具有线程安全?

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

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

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

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


答案 1

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

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

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


答案 2

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