Webservice - 客户端服务实例化

Cri*_*ris 14 java web-services java-metro-framework jax-ws

您知道创建Web服务客户端服务实例的成本是多少?

 JavaWebService service = new JavaWebService();
 SomePort port = service.getJavaWebServicePort(); 
Run Code Online (Sandbox Code Playgroud)

创建服务一次,然后在多线程环境(webapp)中重用相同的端口并不危险?

请注意,端口getPort和端口本身不是线程安全的,但是如果服务成本高昂,每次创建服务时都可能会产生问题.

任何的想法 ?

谢谢

Pap*_*rou 15

在JAX-WS参考实现(Metro)中,创建它JavaWebService是便宜的(在我们生成的客户端中,我们倾向于发现这需要大约20ms).

第一次创作SomePort非常昂贵(我们大约200ms); getSomePort()对同一个JavaWebService实例的后续调用要快得多(对我们来说大约3ms).

因此,JavaWebService每次需要获取a时创建的实现SomePort都会带来一定的费用.简而言之,问题的答案是"相当昂贵".

但是,即使方法SomePort不是线程安全的,方法JavaWebService也是如此.因此,合理的使用模式(至少对于Metro - 线程安全是由于某种程度上缺乏规范而特定于实现)是重用的,JavaWebService因为您只会招致getSomePort()一次昂贵的调用.

更新

这与来自德国甲骨文的员工Andreas Leow的两篇帖子一致,@PapaLazarou在下面的评论中引用的帖子中的一个海报,他写了关于这个Service对象,

您可以为Service每个WSDL 创建一个静态实例:任何单个Service对象都是完全线程安全的,并且可以由任意数量的并发线程共享.

以及港口的使用情况,

虽然我几乎100%确定CXF JAX-WS端口是线程安全的,但Metro的Port对象肯定不是线程安全的.

  • 你有参考吗?到目前为止,我能找到的帖子是返回的端口不是线程安全的,而且CXF的页面说"客户端"(我认为它们意味着端口)不是线程安全的.我正在寻求的是一些*官方*声明,即Metro服务(而不是端口)是线程安全的,特别是调用`getPort`返回单独的实例. (2认同)