如何在风暴拓扑初始化时初始化我们的类?

时间:2015-12-04 09:36:02

标签: java apache-storm

我想在启动风暴拓扑时调用自定义类的init方法,它应该只执行一次。

1 个答案:

答案 0 :(得分:0)

我会把逻辑放在自定义类上,如下所示:

public class MyCustomClass() {

    private static boolean initialized = false;

    public static synchronized void init() {

        if (!initialized) {

            // your initialization logic here

            initialized = true;
        }

    }
}

然后在每个spout的open()方法和每个bolt的prepare()方法中调用MyCustomClass.init()。布尔标志和同步块将确保为每个JVM调用一次初始化逻辑。

更优雅的解决方案是在topologyContext上使用getThisWorkerTasks()和getThisTaskIndex()来测试当前任务是否是特定任务(例如,您的spout的第一个实例),如果是,则运行初始化逻辑。