我有一个基于非常出色,可靠且方便的TopologyTestDriver的Kafka Streams单元测试:
try (TopologyTestDriver testDriver = new TopologyTestDriver(builder.build(),
streamsConfig(Serdes.String().getClass(), SpecificAvroSerde.class))) {
TestInputTopic<String, Event> inputTopic = testDriver.createInputTopic(inputTopicName,
Serdes.String().serializer(), eventSerde.serializer());
TestOutputTopic<String, Frame> outputWindowTopic = testDriver.createOutputTopic(
outputTopicName, Serdes.String().deserializer(), frameSerde.deserializer());
...
}
我想测试更复杂的设置,其中“输出”主题是另一种拓扑的“输入”主题。
我可以在同一拓扑中定义几个输入和输出主题。但是,一旦在相同的拓扑中使用相同的主题作为输入和输出主题,就会出现以下异常:
org.apache.kafka.streams.errors.TopologyException: Invalid topology: Topic events has already been registered by another source.
at org.apache.kafka.streams.processor.internals.InternalTopologyBuilder.validateTopicNotAlreadyRegistered(InternalTopologyBuilder.java:578)
at org.apache.kafka.streams.processor.internals.InternalTopologyBuilder.addSource(InternalTopologyBuilder.java:378)
at org.apache.kafka.streams.kstream.internals.graph.StreamSourceNode.writeToTopology(StreamSourceNode.java:94)
at org.apache.kafka.streams.kstream.internals.InternalStreamsBuilder.buildAndOptimizeTopology(InternalStreamsBuilder.java:303)
at org.apache.kafka.streams.StreamsBuilder.build(StreamsBuilder.java:558)
at org.apache.kafka.streams.StreamsBuilder.build(StreamsBuilder.java:547)
TopologyTestDriver似乎没有提供定义输入输出主题的可能性,对吗?
更新 为了更好地说明我要实现的目标:
builder.stream("input-topic, ...)..to("intermediate-topic",...);
builder.stream("intermediate-topic", ...)..to("output-topic",...);
,并且我希望能够在单元测试中验证(声明)“ intermeidate-topic”的内容。顺便说一句。我无法在构建下一个拓扑部分时“重用”调用“ .to()”的结果,因为该方法返回void。
但是我只有testDriver.createInputTopic()
和testDriver.createOutputTopic()
,没有办法定义类似testDriver.createInputOutputTopic()
的东西。
答案 0 :(得分:0)
使用与输入相同的主题,输出主题应该起作用。但是,您不能多次使用与输入主题相同的主题(strack跟踪表明您尝试这样做)。
如果要使用相同的输入主题两次,则只需添加一次,然后“散开”即可。
KStream stream = builder.stream(...);
stream.map(...); // first usage
stream.filter(...); // second usage
两次使用相同的KStream
对象基本上是一个“扇出”(或“广播”),它将输入数据发送给两个运算符。