批处理在 Spring Boot 应用程序中无法正常工作

问题描述 投票:0回答:0

我目前正在开发一个示例应用程序。我在此应用程序中将用户数据存储在 monogoDB 数据库中。

这是我的User实体:

    public class User extends BaseEntity {
        @Id
        private String id;  
        @NotBlank
        private String name;
        ....
        // getter & setters
    }

我目前正在读取 CSV 文件来更新我的用户表。因为我可以有多个记录,所以我创建批次并在线程上处理它们。这是我的代码示例:

    @Service
    public class UserServiceImpl implements UserService {
    
        @Autowired
        UserProcessingRunnable runnable;
    
        List<String> allUsers = readUserCsvFile();
        //NOTE: I've already confirmed that I'm getting expected results in allUsers.
    
        List<List<String>> batches = ListUtils.partition(allUsers, Constants.BATCH_SIZE);
        // NOTE: For testing purposes, the batch size is set to 10. Additionally, validated batches are being created as expected.
    
        for (List<String> batch : batches) {
            // NOTE: I am processing each batch on different thread.
            runnable.setBatch(batch)
            // Call executor provider (this class implements from ServletContextListener)
            GenericExecutorProvider.getInstance().submit(runnable);
        }
    }

这是我对

Runnable
接口的实现:

    @Component
    public class UserProcessingRunnable implements Runnable {
        private List<String> entities;
        UserRepository userRepository;

        @Override
        public void run() {
            for(String name : entities) {
                User user = new User(name)
                userRepository.save(user)
            }
    }

现在我面临的问题是我看到批次没有按预期进行处理。

例。假设有 5 个批次,分别命名为 b1、b2、b3、b4、b5,每个批次有 10 个用户的数据。

执行后,查看DB时,发现batch b1,b3没有执行。但是批次 b2、b4 执行了两次,批次 b5 执行了一次(即总共 5 次)。

我已经确认批次的形成是正确的,但我继续经历这种不合理的行为。

执行过程中未发现异常或错误。那么有什么解决办法吗?

spring-boot spring-data-jpa executorservice
© www.soinside.com 2019 - 2024. All rights reserved.