Webservice - 客户端服务实例化

时间:2011-07-08 16:27:36

标签: java web-services jax-ws java-metro-framework

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

 JavaWebService service = new JavaWebService();
 SomePort port = service.getJavaWebServicePort(); 

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

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

有什么想法吗?

感谢

2 个答案:

答案 0 :(得分:15)

在JAX-WS参考实现(Metro)中,JavaWebService的创建成本低廉(在我们生成的客户端中,我们倾向于发现这需要大约20ms)。

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

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

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

<强>更新

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

  

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

关于端口的使用,

  

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

答案 1 :(得分:4)

如果您使用的是jax-ws,则无法跨线程共享端口(它们不是线程安全的)。如果您担心创建端口的开销(并且已经测量并确认它是应用程序中的瓶颈),那么您可以创建端口连接池。