Java EE应用服务器中的JAX-WS客户端池



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

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

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

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

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

  • 你会去游泳池吗
  • 你将如何克服网络服务速度缓慢的第一次呼叫
  • 创建该池的最佳方法是什么,这样我就可以做最少的编程(即,我想使用库/API/其他什么,这样就不必重新发明轮子并编写一些毛茸茸的bug)

Apache Commons Pool可能正是我想要的。

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

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

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

"注入的引用不是线程安全的"

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

最新更新