2011-07-08 83 views
12

您是否知道创建web服务客户端服务实例的成本如何?Webservice - 客户端服务实例化

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

在多线程环境(webapp)中重复使用同一端口一次创建服务并不危险?

读取端口getPort和端口本身不是线程安全的,但也创建每次服务时,如果它是一个代价高昂的操作可能会有问题。

有什么想法?

感谢

回答

12

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

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

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

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

更新

这符合两个职位由Andreas Leow如是从Oracle德国雇员,由@PapaLazarou在下面的评论中引用的线程,谁写关于Service对象海报之一,

您可以为每个WSDL只是一个单一的静态Service例如:任何单一Service对象是线程安全的,并且可以通过尽可能多的并发线程,只要你喜欢共享。

和有关端口的使用情况,

虽然我几乎可以100%肯定,CXF的JAX-WS端口是线程安全的,地铁的Port对象绝对是线程安全的。

+2

你有参考吗?到目前为止,我能找到的所有帖子都是返回的端口不是线程安全的,CXF的页面说“客户端”(我假设它们是指端口)不是线程安全的。我正在寻求的是一些*官方的声明,表示Metro服务(而不是端口)是线程安全的,特别是对'getPort'的调用返回单独的实例。 –

+1

我发现了一些由Metro开发者发布的帖子,表明这一点,但一直在努力寻找他们。我最近设法查找的唯一帖子是[this](http://metro.1045641.n5.nabble.com/JAX-WS-clients-td5709817.html)。仅供参考,我的独立并发测试也表明这是事实。 – PapaLazarou

4

如果您使用的JAX-WS,那么你就不能共享跨线程端口(它们不是线程安全的)。如果您担心创建端口的开销(并测量了它并确认它是应用程序中的瓶颈),那么您可以创建一个连接端口池。

+0

我读到他们不是线程安全的cxf网站,他们提供了一个线程安全的getPort ...但我使用MEtro堆栈JaxWS.So创建服务可能是一个沉重的操作? (将开始做一些测试,但不想重新发明车轮) – Cris

相关问题