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

标签 java multithreading servlets asynchronous thread-safety

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

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

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

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

有人可以告诉我什么是最好且不昂贵的方法来处理这个问题吗?

提前致谢。

最佳答案

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

有一个线程来监视上述队列或 MessageBroker 并将项目出队并生成线程,该线程将调用 Web 服务并等待其响应,然后将其放入另一个队列或 MessageBroker 或状态为完成的相同队列中。

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

这样您就不必创建进程并可以使用线程管理一切。创建进程非常耗时,并且您创建进程的设计可能会被黑客利用,通过不断循环发送请求来减慢您的服务器或更糟的情况,甚至导致服务器崩溃。

关于java - 从 Servlet 启动独立应用程序的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17059013/

相关文章:

java - setVisibleItemProperties 无效 VAADIN

java - 使用 Jackson 从 URL 解析 JSON 数据时返回空值

c# - 后台 worker 和跨线程问题

java - 如何杀死从第三方库导入的线程?

java - 如何将不同的菜单项添加到多个上下文菜单?

java - Java 中的动态转换

java - 使用java在n秒内检查和处理一次

java - Tomcat 会自动维护一个 MySql 连接池吗?

Java Servlet - 找不到符号 - 同一文件夹中的对象

tomcat 8.5 servlet 参数 : webappBasePath