spring 并行任务在Sping Boot 3.2和Java 21上停止工作

h7wcgrx3  于 12个月前  发布在  Spring
关注(0)|答案(1)|浏览(140)

只需将我的应用程序迁移到Sping Boot 3.2和Java 21。在开始时,它在并行线程中从MongoDB加载数据,主线程等待直到所有加载完成,然后将其带到内部缓存。有几个集合->所以DataLoader类的确切数量。在更新之前,它与ExecutorService一起工作,没有任何问题:

ExecutorService executorService = Executors.newFixedThreadPool(dataLoaders.size());
List<Future<?>> futures = new ArrayList<>();
for (DataLoader dataLoader : dataLoaders) {
    futures.add(executorService.submit(dataLoader::load));
}
try {
    for (Future<?> future : futures) {
    future.get();            }
} catch (InterruptedException | ExecutionException e) {
    throw new RuntimeException("Can not initialize", e);
}

字符串
每个load()方法从MongoRepositories中获取每个集合的切片数据。现在所有任务都在不同的线程上启动,它们都被阻塞并且没有完成。等待时间-无限。什么原因?
尝试使用CompletableFuture,在Sping Boot 3.2.0检查了所有依赖项的所有版本,检查了mongoDb驱动程序,调试。预计所有并行任务将完成,应用程序将启动

raogr8fs

raogr8fs1#

问题是由于池线程和主线程的死锁。解决方案之一-在所有bean初始化后启动dataLoaders。当前类必须实现接口SmartInitializingSingleton并在重写方法afterSingletonsInstantiated()中执行load方法。

相关问题