使用spring WebServiceTemplate和Jaxb2Marshaller时的线程安全性

时间:2010-08-13 15:49:02

标签: java spring jaxb spring-ws jaxb2

我正在以编程方式使用spring WebServiceTemplate作为Web服务客户端,即不实例化弹簧容器。我正在使用Jaxb2Marshaller进行编组/解组。在我的应用程序中,我创建了一个SaajSoapMessageFactory实例和一个Jaxb2Marshaller实例。我还创建了一个WebServiceTemplate的单个实例,并分配了之前创建的SaajSoapMessageFactory和Jaxb2Marshaller实例。

我创建的WebServiceTemplate以多线程方式使用,即多个线程可以同时调用marshalSendAndReceive。我的问题是 - 我的配置线程安全吗?我担心Jaxb2Marshaller。 javadoc说Jaxb2Marshallers不一定是线程安全的。如何在不重新初始化Jaxb上下文的情况下以线程安全的方式使用Jaxb2Marshaller?

顺便说一句:查看spring reference中的示例spring-ws配置让我相信Jaxb2Marshaller是线程安全的,但Javadoc似乎与此相矛盾。

2 个答案:

答案 0 :(得分:6)

Jaxb2Marshaller的javadoc没有提及线程安全性,所以我不确定为什么你认为它不是。如果它不是线程安全的,那么javadoc会非常清楚地说出来。

WebServiceTemplateSaajSoapMessageFactoryJaxb2Marshaller单身人士的配置完全没问题,而且完全是线程安全的。

答案 1 :(得分:-1)

创建多个Jaxb2Marshaller(比如五个),将它们放入池中(使用LinkedBlockingQueue)。创建线程时,将其传递给队列。

当一个线程需要一个,take()一个来自队列/池。当池为空时,线程将阻止此调用。

当一个线程使用Jaxb2Marshallerput()完成后,它回到队列中,以便其他线程可以使用它。

如果您发现线程经常阻塞等待编组器,请向队列添加更多内容(请参阅第一步)。这样,您可以轻松调整池的大小(甚至可以配置它)。然后队列将自动分发它们。