【问题标题】:Webservice - client service instantiationWebservice - 客户端服务实例化
【发布时间】:2011-10-01 10:22:46
【问题描述】:

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

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

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

请注意,端口 getPort 和端口本身不是线程安全的,而且每次创建服务时都会产生问题,如果这是一项代价高昂的操作。

有什么想法吗?

谢谢

【问题讨论】:

    标签: java web-services jax-ws java-metro-framework


    【解决方案1】:

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

    SomePort 的第一次创建非常昂贵(我们大约需要 200 毫秒);随后在同一 JavaWebService 实例上对 getSomePort() 的调用要快得多(我们大约需要 3 毫秒)。

    因此,每次需要获取SomePort 时创建JavaWebService 的实现会带来一定程度的开销。简而言之,这个问题的答案是“相当昂贵”。

    然而,尽管SomePort 上的方法不是线程安全的,JavaWebService 上的方法却是。因此,明智的使用模式(至少在 Metro 中——由于缺乏规范,线程安全是特定于实现的)是重用 JavaWebService,因为您只会招致一次昂贵的 getSomePort() 调用。

    更新

    这与来自 Oracle Germany 的员工 Andreas Leow 的两篇帖子一致,这是 @PapaLazarou 在下面的评论中引用的线程中的一张海报,他写了关于 Service 对象的文章,

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

    关于端口的使用,

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

    【讨论】:

    • 你有这方面的参考吗?到目前为止,我只能找到返回的端口不是线程安全的帖子,并且 CXF 的页面说“客户端”(我假设它们是指端口)不是线程安全的。我正在寻找的是一些 official 声明 Metro 服务(不是端口)是线程安全的,特别是对 getPort 的调用返回单独的实例。
    • 我发现 Metro 开发人员的一些帖子表明了这一点,但很难再次找到它们。我最近设法找到的唯一帖子是this 一个。仅供参考,我的独立并发测试也表明情况如此。
    • 根据 CXF 文档 (cxf.apache.org/faq.html#FAQ-AreJAX-WSclientproxiesthreadsafe?) “CXF 代理对于许多用例来说都是线程安全的。”有关更多说明,请参阅文档。
    【解决方案2】:

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

    【讨论】:

    • 我读到它们在 cxf 站点上不是线程安全的,它们提供了线程安全的 getPort...但是我使用 MEtro 堆栈 JaxWS。所以创建服务可能是一项繁重的操作? (将开始做一些测试,但不想重新发明轮子)
    猜你喜欢
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    相关资源
    最近更新 更多