如何在Apache Storm中关闭喷口同时给螺栓一些时间来完成?

时间:2019-06-28 16:49:21

标签: java apache-storm

我有一个Storm拓扑,该拓扑从远程服务器读取,然后处理其螺栓中的文本。

当喷嘴检测到没有剩余数据要读取时,同时又让螺栓有时间完成处理时,我想停用/关闭喷嘴。

我尝试在spout中使用deactivate()方法,方法是在检测到没有数据可读取时调用它。我不知道如何使它工作(找不到太多有关它的文档)。

当我发现没有可读取的数据时,我决定调用在喷口中编写的波纹管方法。我在关闭拓扑时使用KillOptions来指定一些等待时间,但是只要调用该方法,它就会继续杀死它,而无需等待。

private void endReading() {
    Map conf = Utils.readStormConfig();
    conf.put("nimbus.seeds", "localhost");
    NimbusClient cc = NimbusClient.getConfiguredClient(conf);
    Nimbus.Client client = cc.getClient();
    try {
         KillOptions ko = new KillOptions();
         ko.set_wait_secs(600);
         ko.set_wait_secs_isSet(true);
         client.killTopologyWithOpts("local-topology", ko); 
    } catch (TException e) {
        e.printStackTrace();
    }
}

我不正确地使用KillOptions吗?有没有一种更简单的方法来关闭喷嘴,同时给螺栓留出时间?任何建议将不胜感激。

编辑:我正在本地运行它,这就是它不起作用的原因,如答案的后续解释中所述。

1 个答案:

答案 0 :(得分:1)

您在做什么是一个很好的解决方案。您发布的代码在运行时将关闭整个拓扑。请记住,它将同时关闭调用它的喷口和同一拓扑中的任何其他喷口。