JAX-WS客户端是线程安全的吗?

21

由于WS客户端端口的初始化非常耗费资源,我们希望重用同一个实例。在每次调用之前,我们还想在BindingProvider/RequestContext中设置不同的值。 最初,我们想这样做:

MyService service = new MyService(wsdlURL, name); 
MyPort myPort = service .getMyServicePort(); 

稍后,在每次调用之前执行以下操作:

Map requestContext = ((BindingProvider)myPort ).getRequestContext(); 
requestContext.put(BindingProvider.USERNAME_PROPERTY, uName); 
requestContext.put(BindingProvider.PASSWORD_PROPERTY, pWord); 
myPort.someFunctionCall();
我的问题是,这段代码是否线程安全? JAX-WS文档似乎表明它不是线程安全的。但是,如果采取预防措施,CXF似乎是线程安全的。如果JAX-WS和Metro特别不是线程安全的,是否有任何方法可以确保线程安全,而无需同步访问端口或ws操作?

这在规格说明中不是很清楚。例如,请查看此链接:http://community.jboss.org/message/526321 - Cratylus
1个回答

16

对于JAX-WS/Metro,它绝对不是线程安全的。最好的方法是创建一个代理池,当需要时从池中获取一个代理,配置它,使用它,清除设置的值,然后将其返回到池中。

或者使用CXF。


2
谢谢丹尼尔,这也是我的猜测,但你有任何官方参考可以证实吗? - PålOliver
看起来像是老东西...但对我来说非常实用。@Daniel,你所说的清除设置值是什么意思?我很感兴趣,因为我曾经问过这个问题,但没有太大的成功:https://dev59.com/aFnUa4cB1Zd3GeqPdsM9 - Cris
对于JAX-WS/Metro而言,它早已经非常非常久以前就是线程安全的。 - rustyx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接