因为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 seems to be so if you take precautions.如果JAX-WS和Metro特别是线程安全,是否有任何方式确保线程安全,而不同步访问端口或ws操作?
解决方法
对于JAX-WS / Metro,这绝对不是线程安全的。最好的办法是创建一个代理池,并在需要时从池中提取代理,配置它,使用它,清除设置的值,返回到池。
或使用CXF。