我想在启动风暴拓扑时调用自定义类的init
方法,它应该只执行一次。
答案 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的第一个实例),如果是,则运行初始化逻辑。