14

你知道创建一个 webservice 客户端服务实例的成本是多少吗?

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

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

读到端口 getPort 和端口本身不是线程安全的,而且每次创建服务时如果它是一项昂贵的操作可能会出现问题。

任何想法 ?

谢谢

4

2 回答 2

16

在 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对象绝对不是线程安全的。

于 2012-01-11T18:07:08.097 回答
4

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

于 2011-07-08T16:50:30.567 回答