簡體   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