Webservice – 客户端服务实例化
您知道创建Web服务客户端服务实例的成本是多少?
JavaWebService service = new JavaWebService(); SomePort port = service.getJavaWebServicePort();
创建服务一次,然后在multithreading环境(webapp)中重用相同的端口并不危险?
请注意,端口getPort和端口本身不是线程安全的,但是如果服务成本高昂,每次创建服务时都可能会产生问题。
任何的想法 ?
谢谢
在JAX-WS参考实现(Metro)中, JavaWebService
的创建是廉价的(在我们生成的客户端中,我们倾向于发现这需要大约20ms)。
SomePort
的第一次创建非常昂贵(我们大约200ms); 在同一个JavaWebService
实例上对getSomePort()
后续调用要快得多(对我们来说大约3ms)。
因此,每次需要获取SomePort
时创建JavaWebService
的实现都会带来一定的费用。 简而言之,问题的答案是“相当昂贵”。
但是,即使SomePort
上的方法不是线程安全的, JavaWebService
上的方法也是如此。 因此,合理的使用模式(至少对于Metro – 线程安全是由于某种程度上缺乏规范而特定于实现)是重用JavaWebService
因为您只需要进行一次昂贵的getSomePort()
调用。
更新
这与来自Oracle德国的员工Andreas Leow的两篇post一致,这是@PapaLazarou在下面的评论中引用的线程中的一个海报,他写了关于Service
对象的文章,
您可以为每个WSDL创建一个静态
Service
实例:任何单个Service
对象都是完全线程安全的,并且可以由任意数量的并发线程共享。
以及港口的使用情况,
虽然我几乎100%确定CXF JAX-WS端口是线程安全的,但Metro的
Port
对象肯定不是线程安全的。
如果您使用的是jax-ws,则无法跨线程共享端口(它们不是线程安全的)。 如果您担心创建端口的开销(并且已经测量并确认它是应用程序中的瓶颈),那么您可以创建端口连接池。