如何加速调用2个Web服务的servlet?

时间:2011-06-14 20:31:35

标签: java multithreading web-services servlets

我有一个调用2个Web服务的servlet。这两个Web服务在单独的线程中调用。在我的servlet thered(扩展HttpServlet的类)中,我启动那两个线程,然后在while循环中等待,直到这些线程完成。 这在while循环完成的JBOSS和Tomcat服务器上消耗了相当多的CPU(几乎100%)。 我使用wsiimport工具为WS客户端创建了代码。为每个HTTP请求创建WSClient对象需要相当长的时间(调用新的WSClient(wsdlLocation,serviceName))。

您能就如何进一步加快速度向我提出任何建议吗?如何更快地创建WS客户端对象?

4 个答案:

答案 0 :(得分:2)

不要busy wait

sleep the current thread短暂延迟直到再次检查以查看其他线程是否已完成,或者在其他操作完成时使用wait() / notify()来警告当前线程(这可能非常虽然在servlet里面凌乱。

至于将新的Web服务客户端导入到您的应用程序中的过程,如果您需要处理不同的WSDL以生成客户端代理代码,我不确定是否有更好的方法。唯一的选择可能是找到一个你根本不需要继续生成新代码的设计。

答案 1 :(得分:1)

您可以创建线程池并为该池中的线程分配调用。查看ThreadPoolExecutor

就更快地创建代理而言,我建议在任一缓存中缓存代理对象或将其绑定到JNDI树。对于缓存引用过时的情况,请正确处理异常,以便重新初始化它们。

答案 2 :(得分:0)

您可能希望使用Tomcat Comet extensions,因此您不必坐在while循环中。

如果你必须使用标准的servlet结构,那么就进行一次大睡眠(类似于try{ Thread.sleep(1000); }catch(InterruptedException ie){}),这样你就可以在while循环中花费大部分时间。它只比简单的while循环略好,所以你真的想看看上面链接的非阻塞选项。

答案 3 :(得分:0)

使用支持 异步请求 Servlet 3.0支持的容器 。这将允许暂停请求并在经过一些长时间处理后恢复。异步支持是使服务器端处理更加高效。 它克服了连接和线程消耗问题。

其中很少支持servlet 3.0:

  • Tomcat的
  • 码头
  • Glassfish的