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

Java Axis2生成的存根是线程安全的吗?,java,web-services,multithreading,thread-safety,axis2,Java,Web Services,Multithreading,Thread Safety,Axis2,Axis2从WSDL生成的客户端存根是线程安全的吗 当然,“线程安全”并不是一个严格定义的术语,所以我至少对以下内容感兴趣: 同一存根类的不同实例是否可由不同线程并发访问,其有效行为是否与单线程执行相同 同一存根类的单个实例是否可由不同线程并发访问,其有效行为是否与在单线程执行中以某种任意方式交错的相同调用相同 您可能还希望使用所描述(和起源)的术语来更精确地讨论这一点。这些存根是无状态的,允许重用存根实例。请详细说明Axis2面临的问题。人们通常建议Xfire优于Axis。我不确定axis2,

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

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

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

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


您可能还希望使用所描述(和起源)的术语来更精确地讨论这一点。

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

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

不过,使用ApacheCommons池来池化实例并一次使用一个线程中的每个实例效果很好


更新:关于Axis2,请参见(声称Axis2在设计上不是线程安全的)

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

例如,见:

如果不调用cleanup/cleanupTransport,您可能会遇到一些套接字泄漏,并耗尽套接字,根据此线程和许多相关线程:

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


我以为XFire已经不存在了,并被合并到另一个项目中。您可以将CXF称为XFire2.0,我对此有点偏见:)谢谢您的回答-您能评论一下提供了什么级别的线程安全性吗?您可以从任意数量的线程并发调用同一对象上的任何方法,并获得预期的行为?我在Axis2方面没有遇到任何特别的问题——只是我们已经使用该框架创建了存根,并且需要量化此类组件的线程安全级别。这对于您自己编写的东西来说(相对而言)比较容易,但对于自动生成的东西来说更难。您使用的数据绑定是什么?我们使用的是XMLBeans数据绑定。要清楚,您的意思是,您不能使用来自多个线程的同一实例,而是使用(同一存根类的)多个实例只要没有对任何给定实例的并发访问,从多个线程访问就可以了?可以。显然存根实例也不必绑定到某个线程。但下面的作者指出axis存根是无状态的,因此可以从多个线程同时安全访问:有趣的是,这个问题的答案是Axis2不是线程安全的,有一个JIRA问题来支持它:指向我投票支持这个答案的链接,主要是因为我现在有大量的重构工作要做,这不是Stefan L的错……我当时的印象是,Apache Axis2正在被淘汰,取而代之的是Apache CXF:可能是这样,但我的问题仍然存在,因为我目前还没有改变底层框架的自由(有一天,可能:)。。。