编纂者多线程与Spring事务
2023-04-11 通信
@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
。宝宝积食怎么办如何消食孩子吃饭没胃口怎么办
吃复方鳖甲软肝片肝能变软吗
治疗肝纤维化选什么药好
蒙脱石散止泻多久起作用
上一篇: 红外线光度计与光电光度计的区别是什么?
- 02-10外国人是怎么避孕的?他们的思想可能和我们有所不同,看看你喜欢哪个
- 02-10需要这样“难为”地主吗?农村建房需要两证,为何不能上门服务!
- 02-10大摩:予中远海运港口与东四同步评级 目标价5.4港元
- 02-10准妈妈分娩是不是有多痛?答案在这里!
- 02-10真相大白!药材被村民哄抢后续:河南民众集体控诉,处理结果来了
- 02-10富瑞:维持泡泡玛特持有估价 目标价20.5港元
- 02-10孕妇后,为什么有的孕妈“妊娠反应”比较强烈?或许和小宝贝有关
- 02-10中央确定海南的城市规模划分:1个大的城市,1个中等的城市,6个小的城市
- 02-10国芯科技(688262.SH)3名间公司合计减持2.84%股份 减持数量过半
- 02-10刚出生的婴儿,有这些乏善可陈,妈妈就偷着乐吧