你知道创建一个 webservice 客户端服务实例的成本是多少吗?
JavaWebService service = new JavaWebService();
SomePort port = service.getJavaWebServicePort();
一次创建服务,然后在多线程环境(webapp)中重用相同的端口并不危险?
读到端口 getPort 和端口本身不是线程安全的,而且每次创建服务时如果它是一项昂贵的操作可能会出现问题。
任何想法 ?
谢谢
你知道创建一个 webservice 客户端服务实例的成本是多少吗?
JavaWebService service = new JavaWebService();
SomePort port = service.getJavaWebServicePort();
一次创建服务,然后在多线程环境(webapp)中重用相同的端口并不危险?
读到端口 getPort 和端口本身不是线程安全的,而且每次创建服务时如果它是一项昂贵的操作可能会出现问题。
任何想法 ?
谢谢
在 JAX-WS 参考实现(Metro)中,创建的JavaWebService
成本很低(在我们生成的客户端中,我们倾向于发现这大约需要 20 毫秒)。
第一次创建SomePort
非常昂贵(对我们来说大约 200 毫秒);getSomePort()
随后对同一实例的调用要JavaWebService
快得多(对我们来说大约 3 毫秒)。
JavaWebService
因此,每次需要获取 a 时都创建 a 的实现SomePort
会带来一定程度的费用。简而言之,这个问题的答案是“相当昂贵”。
然而,即使 on 的方法SomePort
不是线程安全的,但 on 的方法JavaWebService
是。因此,明智的使用模式(至少对于 Metro - 由于缺少规范,线程安全是特定于实现的)是重用JavaWebService
,因为您只会招致getSomePort()
一次昂贵的调用。
更新
这与来自 Oracle Germany 的员工 Andreas Leow 的两篇帖子一致,这是@PapaLazarou 在下面的评论中引用的线程中的一张海报,他写了关于该Service
对象的文章,
每个 WSDL只能创建一个静态
Service
实例:任何单个Service
对象都是完全线程安全的,并且可以由任意数量的并发线程共享。
以及关于端口的使用,
虽然我几乎 100% 肯定 CXF JAX-WS 端口是线程安全的,但 Metro 的
Port
对象绝对不是线程安全的。
如果您使用的是 jax-ws,那么您不能跨线程共享端口(它们不是线程安全的)。如果您担心创建端口的开销(并已对其进行测量并确认它是应用程序中的瓶颈),那么您可以创建一个端口连接池。