Java 如何在初始化storm拓扑时初始化我们的类?

Java 如何在初始化storm拓扑时初始化我们的类?,java,apache-storm,Java,Apache Storm,我想在启动storm拓扑时调用自定义类的init方法,它应该只执行一次。我会在自定义类上设置如下逻辑: public class MyCustomClass() { private static boolean initialized = false; public static synchronized void init() { if (!initialized) { // your initialization logic h

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

我会在自定义类上设置如下逻辑:

public class MyCustomClass() {

    private static boolean initialized = false;

    public static synchronized void init() {

        if (!initialized) {

            // your initialization logic here

            initialized = true;
        }

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


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

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

public class MyCustomClass() {

    private static boolean initialized = false;

    public static synchronized void init() {

        if (!initialized) {

            // your initialization logic here

            initialized = true;
        }

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


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

什么是“init方法”?你指的是什么类型的“自定义类”(一个自己的喷口/螺栓实现)?我想在storm拓扑开始之前执行一些步骤。你想在我假设的集群中执行这些步骤吗?那么
spoot.open()
spoot.activate()
呢?如果spoot崩溃,spoot.open()方法将再次执行。我明白了。我不知道风暴中还有什么其他机制可以帮助。。。你到底想执行什么?您不能手动执行此操作吗?例如,在禁用状态下提交拓扑,运行特殊代码,然后激活拓扑?您所说的“init方法”是什么意思?你指的是什么类型的“自定义类”(一个自己的喷口/螺栓实现)?我想在storm拓扑开始之前执行一些步骤。你想在我假设的集群中执行这些步骤吗?那么
spoot.open()
spoot.activate()
呢?如果spoot崩溃,spoot.open()方法将再次执行。我明白了。我不知道风暴中还有什么其他机制可以帮助。。。你到底想执行什么?您不能手动执行此操作吗?例如,在禁用状态下提交拓扑,运行特殊代码,然后激活拓扑?