【发布时间】:2011-05-24 18:56:46
【问题描述】:
我们正在使用 webservice(通过 websphere),为了提高性能,我们相信我们可以缓存 servicedelegate.getport(..) 创建的代理,因为每次创建代理都很昂贵。
现在,我们的问题是,它是线程安全的吗?想象一下,我们有 10 个线程同时运行,它们会抓取同一个代理,并同时使用它。
谢谢
【问题讨论】:
标签: java web-services proxy websphere
我们正在使用 webservice(通过 websphere),为了提高性能,我们相信我们可以缓存 servicedelegate.getport(..) 创建的代理,因为每次创建代理都很昂贵。
现在,我们的问题是,它是线程安全的吗?想象一下,我们有 10 个线程同时运行,它们会抓取同一个代理,并同时使用它。
谢谢
【问题讨论】:
标签: java web-services proxy websphere
不要让您的应用程序缓存它,而是使用 WebServiceRef 注入它并让容器为您管理它。
【讨论】:
端口不是线程安全的。他们保持状态,例如javax.xml.ws.handler.MessageContext。但是端口对象可以在以后安全地重用!
在调用之前缓存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);
}
}
【讨论】: