从Servlet启动独立应用程序上的线程

时间:2013-06-12 06:33:34

标签: java multithreading servlets asynchronous thread-safety

我有一个Web应用程序(JSP / Servlets),我需要从中调用Web服务来获取响应。由于Web服务需要大约4到5分钟才能发送响应,因此应用程序正在冻结,不允许用户在应用程序上执行任何操作。

要解决此问题,我需要将Web服务调用委托给外部独立应用程序的线程,以便Web服务调用变为异步。有了这个,我有几个问题:

  1. 从带有参数的servlet调用主程序的最佳方法是什么。我正在考虑使用Runtime对象的exec()方法来调用.bat文件。还有什么比这更好的吗?

  2. 我想在每个请求的主程序上启动一个线程。但是为每个请求调用主程序将每次启动JVM(可能是昂贵的资源)。是否可以检查主线程是否正在运行&如果是这样,在同一主线程上启动新线程,而不是再次调用主程序。

  3. 有谁能请让我知道什么是最好的& amp;非昂贵的方式处理这个?

    提前致谢。

2 个答案:

答案 0 :(得分:1)

  

从servlet调用主程序的最佳方法是什么?   参数。我正在考虑使用Runtime对象的exec()方法   调用.bat文件。有什么比这更好的吗?

而不是IMO,您可以在Web应用程序中创建一个线程类并在其中并行执行webservice调用

此外,如果您使用的是Servlet3 API,那么API规范引入的新Async support可能有所帮助

答案 1 :(得分:1)

拥有一个队列或更好的消息,让MessageBroker在您的Web应用程序本身中提交Web服务调用请求,并向用户返回一个唯一的ID。

有一个线程来监视上面提到的Queue或MessageBroker并使项目出列并生成线程,这些线程将调用Web Service并等待其响应,然后将其放入另一个Queue或MessageBroker或状态为complete的同一个。

为用户提供UI以输入唯一ID并检索Web服务调用的结果。

这样您就不必创建进程并可以使用Threads管理所有内容。创建进程非常耗时,并且黑客可以利用您创建进程的设计来降低服务器速度,或者更糟糕地使其崩溃,通过循环发送请求。