我们使用webservice(通过websphere)来提高性能,我们相信我们可以缓存servicedelegate.getport(..)创建的代理,因为每次创建代理都很昂贵。
现在,我们的问题是,它是线程安全的吗?只是图像,我们有10个线程同时运行,他们将获取相同的代理,并同时使用它。
谢谢
不要让你的应用程序缓存它,只需使用WebServiceRef注入它,让容器为你管理它。
端口不是线程安全的。他们像javax.xml.ws.handler.MessageContext
一样保持状态。但是port对象可以在以后安全地重用!
在调用之前缓存LinkedBlockingQueue
和peek
中的端口,然后使用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);
}
}