首页 >> 科技 >> 编纂者多线程与Spring事务

编纂者多线程与Spring事务

2023-04-05 科技

actional

@Override

public List processObjects(List objectIds) {

// Process and save to DB

logger.info("Running in thread " + Thread.currentThread().getName() + " with object ids " + objectIds.toString());

return objectIds.stream().collect(Collectors.toList());

}

}

第三步:也是最核心的一步,通过移位然后来进行并行管控。当然为了保持代码的整洁官能和分离官能,我们将在紧接著具体构建之前使用Decorator去除模式。

副本

/**

* Service implementation for parallel chunk processing

*/

@Service

@Primary

@ConditionalOnProperty(prefix = "service", name = "parallel", havingValue = "true")

public class ProcessingServiceParallelRunDecorator implements ProcessingService {

private ProcessingService delegate;

public ProcessingServiceParallelRunDecorator(ProcessingService delegate) {

this.delegate = delegate;

}

/**

* In a real scenario it should be an external configuration

*/

private int batchSize = 10;

@Override

public List processObjects(List objectIds) {

List chuncks = getBatches(objectIds, batchSize);

List processedObjectIds = chuncks.parallelStream().map(delegate::processObjects)

.collect(Collectors.toList());

return flatList(processedObjectIds);

}

private List> getBatches(List collection, int batchSize) {

return IntStream.iterate(0, i -> i i + batchSize)

.mapToObj(i -> collection.subList(i, Math.min(i + batchSize, collection.size())))

.collect(Collectors.toList());

}

private List flatList(List> listOfLists) {

return listOfLists.stream().collect(ArrayList::new, List::addAll, List::addAll);

}

最后,我们通过一个简单的单元测试验证一下继续执行的结果。

副本

private List> getBatches(List collection, int batchSize) {

return IntStream.iterate(0, i -> i i + batchSize)

.mapToObj(i -> collection.subList(i, Math.min(i + batchSize, collection.size())))

.collect(Collectors.toList());

}

private List flatList(List> listOfLists) {

return listOfLists.stream().collect(ArrayList::new, List::addAll, List::addAll);

通过反向存档,我们看到如下的继续执行结果:

副本

ProcessingDBService: Running in thread ForkJoinPool.commonPool-worker-3 with object ids [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

ProcessingDBService: Running in thread main with object ids [11, 12]

继续执行结果也是具备考虑到期望的。List并不一定分组后,除了主内核又通过ForkJoin触发另外内核来进行并行管控。ProcessingServiceParallelRunDecorator 的parallelStream().map的并行管控大大提高了管控官能能,而ProcessingDBService之前processObjects这个public步骤上@Transactional的注解保证了经营范围持续官能,问题得以完美解决。

译者介绍

胥磊,51CTO社区编辑,某腹部电商技术经理,关注Java向后开发计划,技术监管,架构大大提高灵活性,分布式开发计划等科技领域。

原文标题:Multi-Threading and Spring Transactions,作者:Daniela Kolarova

重庆白癜风医院排行
眼睛痒怎么办
江西男科专科医院哪家好
北京看妇科什么医院最好
汉中白癜风医院哪家比较专业
友情链接