如何防止Spring Boot中的@Async方法参数中的数组被清除?

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

我遇到了

@Async
方法注释的某种线程问题。正在处理从 csv 到 DB 的数据,对于每 10000 条记录,将这些记录传递给另一个用
@Async
注释的方法。调用
@Async
方法后,立即清除 main 方法中的列表,也清除
@Async
中的列表。请帮忙解决这个问题。

一个类中的主要方法

@Async("threadPoolTaskExecutor")
@Override
public CommonResponse generateDedupInputFile(String inputRequest){

   if (stagingData.size() == 10000) {

            futures.add(databaseUpdateChanges.addInputDataStagingV12("tbl_staging", fieldQuery,
                    config.getInputFields(), batchId, stagingData));

            logger.info("staging size: {}", stagingData.size());
            
            stagingData.clear();

        }

}

数据库类

@Async("threadPoolTaskExecutor")
@Transactional
public Future<String> addInputDataStagingV12(String tableName, String fieldQuery, List<InputField> inputFields,
        BigInteger batchId, List<StagingDataModel> stagingDataModels) {

    logger.info("Size : {}", stagingDataModels.size()); //Get data size as Zero
    /** Data insert query**/   

}

调用

stagingData.clear();
后,它也清除了
addInputDataStagingV12
方法中的数据,因此无法插入数据。如果我删除
@Async("threadPoolTaskExecutor")
工作正常。

java spring spring-boot asynchronous spring-async
1个回答
0
投票

stagingData
看起来是类中的局部变量,因此任何人都可以随时更新它。最好复制列表并将其作为参数传递给函数。

这样的事情应该可以解决问题。

List<StagingDataModel> newStagingData = new Arraylist<>(stagingData);

futures.add(databaseUpdateChanges.addInputDataStagingV12("tbl_staging", fieldQuery,
                    config.getInputFields(), batchId, newStagingData));
© www.soinside.com 2019 - 2024. All rights reserved.