在Storm拓扑的所有线程中同步变量

时间:2016-08-12 11:19:15

标签: java multithreading synchronization apache-storm synchronized

我有一个风暴拓扑,可以将一些数据从Kafka队列写入Cassandra DB。该程序是多线程的。为了便于插入cassandra数据库,我将其作为我的DBUtils:

public DBUtils() {
    if(session == null) {
        session = CassandraUtil.getInstance().getSession();
        LOG.info("Started a new session for dbUtils-Monitoring.....");
    }
    synchronized(session) {
        testMapper = new MappingManager(session).mapper(TestVO.class);
    }
}

所以,我使用synchronized在所有正在运行的线程中创建一个dbUtils实例。但是当我检查日志时,似乎会话正在初始化多次。风暴拓扑中的dbUtils仅在prepare方法中初始化,并且已在准备/执行/清理方法中使用。因此,如果我想在所有线程中使用的变量在多个位置使用,则不确定如何使用synchronized块。 我的问题是如何在所有线程中只对session / dbUtils变量进行一次初始化。

1 个答案:

答案 0 :(得分:0)

由于Storm是分布式系统,因此您不能在所有并行运行的螺栓上拥有单个共享变量。您只能在单个工作JVM中共享执行程序上的变量。

为此,您需要创建一个static变量并使用共享/静态对象实例来同步其初始化。