【问题标题】:JAX-WS Client Pool in a Java EE App ServerJava EE 应用服务器中的 JAX-WS 客户端池
【发布时间】:2012-07-11 22:17:42
【问题描述】:

我有一个在 Java EE App Server 中运行的应用程序,它需要调用合作伙伴公司的 Web 服务。

使用我的 JDK (1.6) 中的 wsimport.exe,我生成了客户端类。我实例化服务并获取端口以调用 Web 服务。

我注意到对 Web 服务的第一次调用很慢,我相信这是因为它正在验证 WSDL。后续调用速度很快。

我可以将 WSDL 保存在本地,显然这会加快第一次调用的速度。

为了优化我的应用,我想我可以创建一个客户端池。这还有一个额外的优势,即我在应用程序中有一些限制——假设我有一个由 5 个客户端组成的池,那么我最多将为 5 个客户端使用内存。如果我的服务器上的负载突然增加,我不必担心无限数量的客户端会导致内存不足错误。根据过去的经验,我假设 Web 服务客户端使用大量内存...

  • 你会介意游泳池吗?
  • 您将如何克服对 Web 服务的第一次调用缓慢的问题?
  • 创建该池的最佳方法是什么,这样我就必须做最少的编程(即我想使用库/API/其他什么,这样我就不必重新发明轮子了并编写一些毛茸茸的错误)。

【问题讨论】:

  • 我很高兴来到SO问这个问题,因为我被有用的答案淹没了!说真的,从来没有人从 Java EE 服务器调用过 Web 服务吗?也许这太老了...

标签: web-services jakarta-ee jax-ws actor


【解决方案1】:

我的一位同事建议您可以在 EJB 中的字段上使用 @WebServiceRef 注释。这个想法是服务器会注入一个对客户端的引用,从中可以为每个调用 EJB 的线程创建一个端口。

我假设注入的引用来自一个池,尽管规范似乎没有谈到这一点。注释的 Javadoc 明确提到:

“注入的引用不是线程安全的”

【讨论】:

  • 这不起作用。注入的服务总是新的,在本地笔记本电脑上获取端口的调用平均需要 15 毫秒,其中 web 服务在该笔记本电脑上运行,并且 WSDL 部署在 web 服务器上而不是项目内部。这表明在本地拥有 WSDL 是绝对必要的。
【解决方案2】:

Apache Commons Pool 可能正是我所追求的。

它是可配置的,似乎已经考虑了一切。

【讨论】:

  • 效果很好 - 这是三个选项中最好的。
【解决方案3】:

AKKA 具有链接中所示的主/从设置可以很好地工作,尽管它比另一个答案中列出的 Apache Commons Pool 稍微复杂一些。 AKKA 还使用了一个执行池,它有自己的线程,这在 Java EE 世界中是不允许的,尽管我认为因为一个经过良好测试的框架负责线程,所以没有危险,它应该'无论如何都不会干扰应用服务器对线程的控制,因为 AKKA 处理的线程数量很少。

【讨论】:

  • 不选择这个,虽然它很有趣,但代码比其他解决方案更复杂。
猜你喜欢
  • 2011-05-05
  • 2017-04-05
  • 1970-01-01
  • 1970-01-01
  • 2013-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多