servicedelegate.getport创建的代理可以重用吗?它是线程安全的吗?

问题描述 投票:0回答:2

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

现在,我们的问题是,它是线程安全的吗?只是图像,我们有10个线程同时运行,他们将获取相同的代理,并同时使用它。

谢谢

java web-services proxy websphere
2个回答
0
投票

不要让你的应用程序缓存它,只需使用WebServiceRef注入它,让容器为你管理它。


0
投票

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

在调用之前缓存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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.