等待submitToplogy完成

时间:2018-05-22 14:33:38

标签: apache-storm

我正在阅读风暴应用书。我在书中找到了以下代码片段

LocalCluster lc = new LocalCluster()
lc.submitTopology("GitHub-commit-count-topology"), config, topology);
Utils.sleep(TEN_MINUTES)
lc.killTopology("GitHub-commit-count-topology")
lc.shutdown()

因此,此代码将提交执行的拓扑等待固定的10分钟,然后终止拓扑。但这很奇怪。我怎么能说。 submitTopology等待它完成并完成。杀死并关闭。

就像在Akka Streams中一样,我们得到Future[Done],我们只是等待那个未来完成。 (而不是固定10分钟)。

1 个答案:

答案 0 :(得分:1)

您可以使用https://github.com/apache/storm/blob/master/storm-server/src/main/java/org/apache/storm/Testing.java#L376执行此操作。

在某些情况下不使用它的原因是它需要拓扑中的每个spout都实现CompletableSpout接口https://github.com/apache/storm/blob/4137328b75c06771f84414c3c2113e2d1c757c08/storm-client/src/jvm/org/apache/storm/testing/CompletableSpout.java

大多数Storm spouts从未达到过“完成”的程度(因为它是一个流处理框架,而不是批处理框架),因此无法确定拓扑何时完成。例如,如果您正在使用Kafka主题中的消息,那么生产者可能会在任何时候向主题添加更多消息,那么消费者将如何确定消息已完成消费?

CompletableSpout主要用于简化测试,因为喷嘴可以说是否完成了测试。然后,我链接的completeTopology方法可以使用此额外功能来判断拓扑中的所有spout是否已“完成”,并且可以在此之后停止拓扑。

如果你在测试中使用的喷口没有实现CompletableSpout(大多数喷口没有),那么一般情况下无法确定拓扑结束的时间。在许多情况下,您仍然可以比您链接的示例做得更好,例如如果我的拓扑结构应该在测试中将10条消息写入队列,那么一旦将10条消息写入队列,我就可以使测试结束。

要与Akka流相关,我并不熟悉它们,但是看一下介绍性文档,你可以认为CompletableSpout类似于有界源(例如a Source(1 to 100)),而“normal” spout是无限的来源(例如Source.repeat(1))。