如何将单个石英作业与线程池并行化?

我在Spring启动应用程序中有一个固定的计划作业,当每5分钟触发一次时,它会通过一种方法将大列表中的项目发送到某些Web服务。

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

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

@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);
                }
            });
        }
    }
}

那么,如何在单个作业中与互助工作者一起运行此send方法?
否则,设置多个相同作业以通过相同方法发送相同列表是一种好习惯吗?

liaoyi1107 回答:如何将单个石英作业与线程池并行化?

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

        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说,最好在其他地方创建它并注入到您的服务中。

本文链接:https://www.f2er.com/3152167.html

大家都在问