【问题标题】:Can proxy created by servicedelegate.getport reusable? is it Thread-safe?servicedelegate.getport 创建的代理可以重用吗?它是线程安全的吗?
【发布时间】:2011-05-24 18:56:46
【问题描述】:

我们正在使用 webservice(通过 websphere),为了提高性能,我们相信我们可以缓存 servicedelegate.getport(..) 创建的代理,因为每次创建代理都很昂贵。

现在,我们的问题是,它是线程安全的吗?想象一下,我们有 10 个线程同时运行,它们会抓取同一个代理,并同时使用它。

谢谢

【问题讨论】:

    标签: java web-services proxy websphere


    【解决方案1】:

    不要让您的应用程序缓存它,而是使用 WebServiceRef 注入它并让容器为您管理它。

    【讨论】:

      【解决方案2】:

      端口不是线程安全的。他们保持状态,例如javax.xml.ws.handler.MessageContext。但是端口对象可以在以后安全地重用!

      在调用之前缓存LinkedBlockingQueuepeek中的端口,然后在offer之后返回。

      在以下实现中,port 对象不会从call 代码中泄漏出来,因此可以安全地重用它:

      private LinkedBlockingQueue<Port> portCache = new LinkedBlockingQueue<>();
      
      public Rsp call(Req req) {
          Port port = portCache.poll();
          if (port == null) {
              port = createPort();
          }
          BindingProvider provider = (BindingProvider) port;
          try {
              return portMethod.invoke(port, req);
          } finally {
              portCache.offer(port);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-30
        • 1970-01-01
        相关资源
        最近更新 更多