为了加快我的应用程序(Spring Boot,Neo4j数据库,Spring Data Neo4j 4)中的数据消耗,我引入了Apache ActiveMQ并配置了10个并发消费者。
在那之后,我遇到了计数器更新的问题。
我从Apache ActiveMQ使用者执行以下createDecisions
方法:
@Override
public Decision create(String name, String description, String url, String imageUrl, boolean multiVotesAllowed, Long parentDecisionId, User user) {
Decision parentDecision = null;
if (parentDecisionId != null) {
parentDecision = ofNullable(findById(parentDecisionId)).orElseThrow(() -> new EntityNotFoundException("Parent decision with a given id not found"));
}
Decision decision = decisionRepository.save(new Decision(name, description, url, imageUrl, multiVotesAllowed, parentDecision, user), user);
if (parentDecision != null) {
updateTotalChildDecisions(parentDecision, 1);
}
return decision;
}
在createDecision
方法内部我做了一些逻辑,然后更新parentDecision.totalChilDecisions
计数器:
@Override
public Decision updateTotalChildDecisions(Decision decision, Integer increment) {
decision.setTotalChildDecisions(decision.getTotalChildDecisions() + increment);
return decisionRepository.save(decision);
}
在并发环境中执行后,此计数器与数据库中的实际内容不匹配,但在单线程环境(1 ActiveMQ使用者)中,一切正常。
我认为主要问题是在totalChildDecisions
更新期间,parentDecision
指的是旧的SDN 4对象,而不是实际数据(totalChildDecisions
)。如何正确更新parentDecision.totalChildDecisions
?
如何正确同步我的代码以使计数器在并发ActiveMQ使用者身上运行?