gpt4 book ai didi

java - 如何使用线程池并行化单个 quartz 作业?

转载 作者:行者123 更新时间:2023-12-01 21:57:41 25 4
gpt4 key购买 nike

我的 Spring boot 应用程序中有一个 quartz 计划作业,每 5 分钟触发一次,通过一种方法将项目从大型列表发送到某些 Web 服务。

我想知道我的发送过程(单一发送方法)可以并行化吗?我想要的是,例如,当 10000 个项目列表来自数据库时,线程池中的线程将同时工作以发送该列表中的所有记录,并且在发送所有记录后作业将完成。

我在下面的代码中尝试过,我设置了一个 5 线程池大小的 ThreadPoolTask​​Executor 。然而,当我执行并检查作业日志时,它说作业在几秒钟内完成,但发送所有数据需要几分钟。它继续正常工作,但作业似乎在几秒钟内完成了。它可能表示在所有线程设置后工作已完成。这是我避免的事情,因为需要了解作业执行时间和日志。

@Autowired
MyService myService;

@NonTransactionalService
public class MySenderService{

ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(5);
taskExecutor.setMaxPoolSize(5);
taskExecutor.initialize();

public void sendAll(){
List<Long> largeList = someMethod();
largeList.stream().forEach(i -> {
taskExecutor.execute(new Runnable() {
@Override
public void run() {
myService.send(i);
}
});
}
}
}

那么,如何在一个单个作业中使用多个工作人员运行此发送方法?
否则设置多个相同的作业通过相同的方法发送相同的列表是一个好习惯吗?

最佳答案

您可以尝试使用 Flux,恕我直言,这是需要更少代码的解决方案:

        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(5);
taskExecutor.setMaxPoolSize(5);
taskExecutor.initialize();

List<Integer> largeList = someMethod();
System.out.println(largeList);
Flux.fromStream(largeList.stream())
.parallel(5)
.runOn(Schedulers.fromExecutor(taskExecutor))
.subscribe( x -> { System.out.println(x);});

taskExecutor.shutdown();

不要忘记关闭 TaskExecutor,但要像 @M 那样。 Deinum 说,最好在其他地方创建它并注入(inject)到您的服务中。

关于java - 如何使用线程池并行化单个 quartz 作业?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58730360/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com