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

时间:2020-01-14 10:16:02

标签: spring-kafka

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

@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) {
    }
}

2 个答案:

答案 0 :(得分:1)

通常,您将把所有@KafkaHandler放在同一个班级。

您可以执行所需的操作,但是每个侦听器都必须位于不同的使用者组中,并且您需要一种默认方法来丢弃您不感兴趣的事件。

@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
    }

}

答案 1 :(得分:0)

在尝试这种方法后,只需分享一个发现,便可以按@KafkaListener类执行侦听器容器的逻辑。也就是说,针对同一事件,FilterStrategy和MessageConverter的关联逻辑将多次运行,这可能不是我们想要的。