在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
对象绝对是不线程安全的。
你有参考吗?到目前为止,我能找到的所有帖子都是返回的端口不是线程安全的,CXF的页面说“客户端”(我假设它们是指端口)不是线程安全的。我正在寻求的是一些*官方的声明,表示Metro服务(而不是端口)是线程安全的,特别是对'getPort'的调用返回单独的实例。 –
我发现了一些由Metro开发者发布的帖子,表明这一点,但一直在努力寻找他们。我最近设法查找的唯一帖子是[this](http://metro.1045641.n5.nabble.com/JAX-WS-clients-td5709817.html)。仅供参考,我的独立并发测试也表明这是事实。 – PapaLazarou