我有一个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) {
}
}
答案 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的关联逻辑将多次运行,这可能不是我们想要的。