Порты не являются потокобезопасными.Они держат состояние, как 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);
}
}