Web 服务 - 客户端服务实例化

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

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

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

请阅读端口 getPort 和端口本身不是线程安全的,但每次创建服务时,如果操作成本高昂,则可能会有问题。

任何想法?

谢谢


答案 1

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

第一次创建是相当昂贵的(对我们来说大约200ms);对同一实例的后续调用要快得多(对我们来说大约3ms)。SomePortgetSomePort()JavaWebService

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

但是,即使 上的方法不是线程安全的,但 上的方法也是。因此,明智的使用模式(至少在Metro中 - 由于缺乏规范,线程安全是特定于实现的)是重用的,因为您只会产生一次昂贵的调用。SomePortJavaWebServiceJavaWebServicegetSomePort()

更新

这与来自甲骨文德国的员工Andreas Leow的两篇帖子一致,@PapaLazarou在下面的评论中引用了帖子中的海报之一,他写了关于该物体的文章,Service

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

以及关于端口的使用,

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


答案 2

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


推荐