Kafka Streams TopologyTestDriver输入输出主题

时间:2020-05-03 19:13:19

标签: apache-kafka-streams

我有一个基于非常出色,可靠且方便的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()的东西。

1 个答案:

答案 0 :(得分:0)

使用与输入相同的主题,输出主题应该起作用。但是,您不能多次使用与输入主题相同的主题(strack跟踪表明您尝试这样做)。

如果要使用相同的输入主题两次,则只需添加一次,然后“散开”即可。

KStream stream = builder.stream(...);
stream.map(...); // first usage
stream.filter(...); // second usage

两次使用相同的KStream对象基本上是一个“扇出”(或“广播”),它将输入数据发送给两个运算符。