我有一个Web应用程序(JSP / Servlets),我需要从中调用Web服务来获取响应。由于Web服务需要大约4到5分钟才能发送响应,因此应用程序正在冻结,不允许用户在应用程序上执行任何操作。
要解决此问题,我需要将Web服务调用委托给外部独立应用程序的线程,以便Web服务调用变为异步。有了这个,我有几个问题:
从带有参数的servlet调用主程序的最佳方法是什么。我正在考虑使用Runtime对象的exec()方法来调用.bat文件。还有什么比这更好的吗?
我想在每个请求的主程序上启动一个线程。但是为每个请求调用主程序将每次启动JVM(可能是昂贵的资源)。是否可以检查主线程是否正在运行&如果是这样,在同一主线程上启动新线程,而不是再次调用主程序。
有谁能请让我知道什么是最好的& amp;非昂贵的方式处理这个?
提前致谢。
答案 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管理所有内容。创建进程非常耗时,并且黑客可以利用您创建进程的设计来降低服务器速度,或者更糟糕地使其崩溃,通过循环发送请求。