代码之家  ›  专栏  ›  技术社区  ›  neesh

使用SpringWebServiceTemplate和JAXB2marshaller时的线程安全性

  •  5
  • neesh  · 技术社区  · 15 年前

    我以编程方式使用SpringWebServiceTemplate作为Web服务客户机,即不实例化Spring容器。我正在使用JAXB2marshaller进行编组/解组。在我的应用程序中,我创建了一个saajsoapmessagefactory实例和一个jaxb2marshaller实例。我还创建了一个WebServiceTemplate实例,并分配了以前创建的saajsoapMessageFactory和jaxb2marshaller实例。

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

    旁白:查看中的SpringWS配置示例 spring reference 这让我相信JAXB2marshaller是线程安全的,但JavaDoc似乎与此矛盾。

    2 回复  |  直到 9 年前
        1
  •  6
  •   skaffman    15 年前

    JavaDoc Jaxb2Marshaller 不管怎么说,都没有提到线程安全,所以我不知道你为什么认为这不是。如果不是线程安全的话,javadoc会说得很清楚。

    您的配置 WebServiceTemplate , SaajSoapMessageFactory JAXB2-马歇尔 单件非常好,而且完全可以穿线。

        2
  •  -1
  •   Aaron Digulla    9 年前

    创建几个 Jaxb2Marshaller (说五个),把它们放进游泳池(用 LinkedBlockingQueue )创建线程时,将其传递到队列。

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

    当使用 JAXB2-马歇尔 , put() 它返回到队列中,以便其他线程可以使用它。

    如果发现线程在等待封送拆收器时阻塞得太频繁,请向队列中添加更多线程(请参见第一步)。这样,您就可以轻松地调整池的大小(甚至使其可配置)。然后,队列将自动分发它们。