我正在以编程方式使用spring WebServiceTemplate作为Web服务客户端,即不实例化弹簧容器。我正在使用Jaxb2Marshaller进行编组/解组。在我的应用程序中,我创建了一个SaajSoapMessageFactory实例和一个Jaxb2Marshaller实例。我还创建了一个WebServiceTemplate的单个实例,并分配了之前创建的SaajSoapMessageFactory和Jaxb2Marshaller实例。
我创建的WebServiceTemplate以多线程方式使用,即多个线程可以同时调用marshalSendAndReceive。我的问题是 - 我的配置线程安全吗?我担心Jaxb2Marshaller。 javadoc说Jaxb2Marshallers不一定是线程安全的。如何在不重新初始化Jaxb上下文的情况下以线程安全的方式使用Jaxb2Marshaller?
顺便说一句:查看spring reference中的示例spring-ws配置让我相信Jaxb2Marshaller是线程安全的,但Javadoc似乎与此相矛盾。
答案 0 :(得分:6)
Jaxb2Marshaller
的javadoc没有提及线程安全性,所以我不确定为什么你认为它不是。如果它不是线程安全的,那么javadoc会非常清楚地说出来。
WebServiceTemplate
,SaajSoapMessageFactory
和Jaxb2Marshaller
单身人士的配置完全没问题,而且完全是线程安全的。
答案 1 :(得分:-1)
创建多个Jaxb2Marshaller
(比如五个),将它们放入池中(使用LinkedBlockingQueue
)。创建线程时,将其传递给队列。
当一个线程需要一个,take()
一个来自队列/池。当池为空时,线程将阻止此调用。
当一个线程使用Jaxb2Marshaller
,put()
完成后,它回到队列中,以便其他线程可以使用它。
如果您发现线程经常阻塞等待编组器,请向队列添加更多内容(请参阅第一步)。这样,您可以轻松调整池的大小(甚至可以配置它)。然后队列将自动分发它们。