Neo4j,SDN4,ActiveMQ多个消费者和数据同步

时间:2017-06-22 10:28:53

标签: java multithreading neo4j activemq spring-data-neo4j-4

为了加快我的应用程序(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使用者身上运行?

0 个答案:

没有答案