java - Spring和后台线程执行

标签 java spring multithreading

我有一个 Spring Boot 1.3.5 Web 应用程序(在 Tomcat 8 上运行),其功能之一是通过 REST 联系第三方 API 并启动许多冗长的作业(从 1 个到大约 30 个,具体取决于用户输入,每个在 for 循环中都有自己的 REST 调用)。我在使用带有一些参数的 POST 调用的 Controller 中拥有所有这些逻辑。

我需要的是在 API 确认每个作业后启动一个后台任务,该任务将传递一些参数(作业 ID)并定期(~30 秒)轮询另一个 API 以获取作业输出(再次,这些作业可能需要几秒到一个小时,并且完成它的作业大约需要 3-4 秒加上解析一个长字符串)并根据它们的状态执行一些业务逻辑(现在更新数据库记录)

但是我不确定是哪个,如果有的话,TaskExecutor使用,或者我是否应该使用 Java 的 Future为此的结构。我可能会受益于线程池,它只会并行运行 X 个线程并将其他线程排入队列,以免服务器过载。有没有我可以学习和开始的例子?

我现有代码的示例:

@RequestMapping(value={"/job/launch"}, method={RequestMethod.POST})
public ResponseEntity<String> runJob(HttpServletRequest req) {
    for (int deployments=1; deployments <= deployments_required; deployments++) {
        httpPost.setEntity((HttpEntity)new StringEntity(jsonInput));
        CloseableHttpResponse response = httpclient.execute(httpPost);
        HttpEntity entity = response.getEntity();
        responseString = EntityUtils.toString(entity, "UTF-8");
        JsonObject jsonObject = new JsonParser().parse(responseString).getAsJsonObject();
        if (response.getStatusLine().getStatusCode() != 200) {
            resultsNotOk.add(new ResponseEntity<String>(jsonObject.get("message").getAsString(), HttpStatus.INTERNAL_SERVER_ERROR));
            continue;
        }
        String deploymentId;
        deploymentId = jsonObject.get("id").getAsString();
        // Start background task to keep checking the job every few seconds and find created instance IP addresses
        start_checking_execution(deploymentId);
    }
}

(是的,这段代码最好放在服务中,但它最初是按原样构建的,所以我还没有移动它。现在可能是做这件事的好时机)

最佳答案

我会说它适用于 Spring Batch

您可以定义 Reader/Processor(将源读取转换为目标写入对象)/Writer 来处理逻辑

您可以使用 JobOperator 获取作业状态。参见 job status transitions

关于java - Spring和后台线程执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41957726/

相关文章:

java - Java 中 Cassandra 的多个并发连接

java - 循环未从 java 中的 actionPerformed 获取更新的 boolean 值

java - 如何使用另一个类的参数创建一个类的对象? java

Java URI 正则表达式花费的时间太长

java - 使用 Jackson 的非对称名称/属性映射,更优雅的解决方案?

IO绑定(bind)任务中的Python多线程

java - Spring数据规范中的可为空参数

java - 上下文初始化时遇到异常

java - Spring 存储库 : find by a field with two conditions

java - @Autowired 和实例化