我有一个调用2个web服务的servlet。这两个web服务是在单独的线程中调用的。在我的servlet thered (扩展HttpServlet的类)中,我启动了这两个线程,然后在while循环中等待,直到这些线程结束。这在JBOSS和Tomcat服务器上消耗了相当多的CPU (几乎100%),直到while循环结束。我使用wsiimport工具为WS客户端创建了代码。为每个HTTP请求创建WSClient对象(调用新的WSClient (wsdlLocation,serviceName))需要相当长的时间。
你能给我一些关于如何进一步提高速度的建议吗?如何更快地创建WS客户端对象?
发布于 2011-06-15 04:40:38
别busy wait了。
或者在再次检查其他线程是否已完成之前使用sleep the current thread进行短暂的延迟,或者利用wait() / notify()在其他操作完成时向当前线程发出警报(尽管这在servlet中可能会非常混乱)。
至于将新的web服务客户端导入到您的应用程序中的过程,如果您需要处理不同的WSDL来生成客户端代理代码,我不确定还有更好的方法。唯一的选择可能是找到一种根本不需要不断生成新代码的设计。
发布于 2011-06-15 23:37:46
您可以创建一个线程池,并将调用分配给该池中的线程。查看ThreadPoolExecutor
至于更快地创建代理,我建议在缓存中缓存代理对象,或者将其绑定到JNDI树。正确处理缓存引用失效的情况下的异常,以便您可以重新初始化它们。
发布于 2011-06-15 04:36:43
您可能希望考虑使用Tomcat Comet extensions,这样就不必陷入while循环。
如果您必须使用标准的servlet结构,那么可以设置一个大的休眠(类似于try{ Thread.sleep(1000); }catch(InterruptedException ie){}),这样您就可以在while循环中花费大部分时间休眠。它只比一个简单的while循环稍微好一点,所以你真的想看看上面链接的非阻塞选项。
https://stackoverflow.com/questions/6349738
复制相似问题