多个 KafkaListener 类 可以听同一个话题吗?

Can multiple KafkaListener classes listen to the same topic?

我有一个包含多个事件(不同类型)的 kafka 主题,我想在单个应用程序中的不同处理程序 类 中处理这些事件。所以我的问题是 - 我可以创建两个使用相同主题但每个处理不同事件(来自同一主题)的 类(spring 组件)吗?

@Component
@KafkaListener(topics = "topicA")
public class SomeClass {

    @KafkaHandler
    public void handleEventA(EventA eventA) {
    }
}

@Component
@KafkaListener(topics = "topicA")
public class AnotherClass {

    @KafkaHandler
    public void handleEventB(EventB eventB) {
    }

    @KafkaHandler
    public void handleEventC(EventC eventC) {
    }
}

通常您会将所有 @KafkaHandler 放在同一个 class 中。

你可以随心所欲,但每个监听器需要在不同的消费者组中,你需要一个默认方法来丢弃你不感兴趣的事件。

@Component
@KafkaListener(id = "some", topics = "topicA")
public class SomeClass {

    @KafkaHandler
    public void handleEventA(EventA eventA) {
    }

    @KafkaHandler(isDefault = true)
    public void handleOthers(Object others) {
        // discard
    }

}

@Component
@KafkaListener(id = "another", topics = "topicA")
public class AnotherClass {

    @KafkaHandler
    public void handleEventB(EventB eventB) {
    }

    @KafkaHandler
    public void handleEventC(EventC eventC) {
    }

    @KafkaHandler(isDefault = true)
    public void handleOthers(Object others) {
        // discard
    }

}

分享一下我们尝试过这种方法后的发现,监听器容器的逻辑是按@KafkaListener class执行的。即FilterStrategy和MessageConverter的关联逻辑对于同一个事件会运行多次,这可能不是我们想要的。