繁体   English   中英

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

[英]thread safety when using spring WebServiceTemplate and Jaxb2Marshaller

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

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

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

Jaxb2Marshaller的Javadoc没有以一种或另一种方式提及线程安全性,因此我不确定为什么您认为并非如此。 如果不是线程安全的,那么javadoc会非常清楚地说明这一点。

您对WebServiceTemplateSaajSoapMessageFactoryJaxb2Marshaller单例的配置非常好,并且完全是线程安全的。

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

当一个线程需要一个, take()从队列/池之一。 当池为空时,线程将在此调用上阻塞。

使用Jaxb2Marshaller完成线程后, put()其放回队列中,以便其他线程可以使用它。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM