Apache storm 是否有Java API可以知道拓扑何时准备好从Spout读取第一条消息

Apache storm 是否有Java API可以知道拓扑何时准备好从Spout读取第一条消息,apache-storm,apache-storm-topology,Apache Storm,Apache Storm Topology,我们的ApacheStorm拓扑使用KafkaSpout监听来自Kafka的消息,并在执行大量映射/减少/丰富/聚合等操作后,最终将数据插入Cassandra。还有另一个kafka输入,在这里我们接收用户对数据的查询,如果topology找到响应,它会将其发送到第三个kafka主题。现在,我们想使用Junit编写E2E测试,在该测试中,我们可以直接以编程方式将数据插入拓扑,然后通过插入用户查询消息,我们可以在第三点断言在查询中收到的响应是正确的 为了实现这一点,我们考虑启动EmbeddedKaf

我们的ApacheStorm拓扑使用KafkaSpout监听来自Kafka的消息,并在执行大量映射/减少/丰富/聚合等操作后,最终将数据插入Cassandra。还有另一个kafka输入,在这里我们接收用户对数据的查询,如果topology找到响应,它会将其发送到第三个kafka主题。现在,我们想使用Junit编写E2E测试,在该测试中,我们可以直接以编程方式将数据插入拓扑,然后通过插入用户查询消息,我们可以在第三点断言在查询中收到的响应是正确的

为了实现这一点,我们考虑启动EmbeddedKafka和CassandraUnit,然后用它们替换实际的Kafka和Cassandra,然后我们可以在这个Junit测试的上下文中启动拓扑


在开始实际测试之前,我们创建拓扑并将其提交到LocalCluster。它在另一个线程上启动拓扑,然后从之前的线程中出来并开始执行我们的测试。直到那时,拓扑还没有准备好,因为它需要一些时间来准备处理。是否有任何java API可以告诉我们拓扑何时准备好进行处理(表示准备好从Spoute读取第一条消息)?

这取决于您所说的“准备好进行处理”是什么意思

如果为LocalCluster启用时间模拟,则可以使用
time.advanceClusterTime
逐步推进时间。如果在提交拓扑后调用此方法,则仅当集群大部分处于空闲状态时,它才会返回。见例

如果您愿意用存根(例如FixedTupleSpoot)替换喷口,则可以使用
Testing.completeTopology
等待拓扑完成对设置存根要发出的所有元组的处理

等待拓扑处理一些元组的另一种方法是,在Kafka中放入一些消息,启动拓扑,然后让测试线程轮询Cassandra,看看您期望的消息是否成功。这样,您就可以在测试线程中设置一个超时,如果在几秒钟内没有满足条件,测试就会失败。您可以使用一个实用程序,比如等待,或者只编写自己的轮询逻辑


如果您所说的“准备处理”是指其他内容,请更详细地描述您的意思。

“准备处理”是指准备好阅读喷口的第一条消息。我们有关于风暴测试的博客或书籍吗?根据您的回答,现在我知道test package和Testing中有很多test helper类。java中有很多可以用于Storm拓扑测试的东西。是否有任何在线资源可以解释Testing package+Testing.java中所有类的用法?我不相信。多年来,各种各样的人都写过这方面的文章,我认为这是最接近全面概述的。在网站上添加一个关于这个的部分可能会很好。有什么理由降级吗?降级什么?