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 操作的情况下确保线程安全?

4

1 回答 1

16

对于 JAX-WS/Metro,这绝对不是线程安全的。最好的办法是创建一个代理池,并在需要时从池中拉出一个代理,配置它,使用它,清除设置值,然后返回池。

或者使用 CXF。

于 2010-12-08T12:38:24.673 回答