我有一个 Web 应用程序(JSP/Servlet),我需要从中调用 Web 服务来获取响应。由于 Web 服务大约需要 4 到 5 分钟才能发送响应,因此应用程序被卡住,不允许用户在应用程序上执行任何操作。
要解决此问题,我需要将 Web 服务调用委托(delegate)给外部独立应用程序的线程,以便 Web 服务调用变为异步。对此,我有几个问题:
从带有参数的 servlet 调用主程序的最佳方式是什么。我正在考虑使用运行时对象的 exec() 方法来调用 .bat 文件。还有比这更好的吗?
我想在主程序上为每个请求启动一个线程。但是为每个请求调用主程序每次都会启动 JVM(资源方面可能会很昂贵)。是否可以检查主线程是否正在运行,如果是,则在同一主线程上启动新线程,而不是再次调用主程序。
有人可以告诉我什么是最好且不昂贵的方法来处理这个问题吗?
提前致谢。
最佳答案
拥有一个队列或更好的 MessageBroker,以便在 Web 应用程序本身中提交 Web 服务调用请求并向用户返回唯一的 ID。
有一个线程来监视上述队列或 MessageBroker 并将项目出队并生成线程,该线程将调用 Web 服务并等待其响应,然后将其放入另一个队列或 MessageBroker 或状态为完成的相同队列中。
提供一个 UI,供用户输入唯一 ID 并检索 Web 服务调用的结果。
这样您就不必创建进程并可以使用线程管理一切。创建进程非常耗时,并且您创建进程的设计可能会被黑客利用,通过不断循环发送请求来减慢您的服务器或更糟的情况,甚至导致服务器崩溃。
关于java - 从 Servlet 启动独立应用程序的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17059013/