我正在使用Kafka消息代理发布和订阅事件。对于那些使用spring基础设施的人。我的要求是我需要创建一个将订阅多个主题的消费者。
下面的代码在订阅单个主题时效果很好。
@KafkaListener(topics = "com.customer.nike")
public void receive(String payload) {
LOGGER.info("received payload='{}'", payload);
}
但是我想要,它应该订阅某种主题模式。 喜欢..
@KafkaListener(topics = "com.cusotmer.*.nike")
public void receive(String payload) {
LOGGER.info("received payload='{}'", payload);
}
在此代码中*会不断变化。它可能是一些数值,例如1000。1010,依此类推。为此,我还使用了SpeL。
@KafkaListener(topics = "#{com.cusotmer.*.nike}")
public void receive(String payload) {
LOGGER.info("received payload='{}'", payload);
}
但是这个也不适合我。 有人可以帮我订阅多个主题。
先谢谢了。
答案 0 :(得分:1)
关于多种主题的订阅,您可以使用topicPatterns来实现:
此侦听器的主题模式。条目可以是“主题 模式”,“属性占位符键”或“表达式”。的 框架将创建一个订阅所有主题的容器 匹配指定的模式以获取动态分配的分区。 模式匹配将针对主题定期执行 检查时已存在。表达式必须解析为 主题模式(支持字符串或模式结果类型)。
与topic()和topicPartitions()互斥。
@KafkaListener(topicPattern = "com.customer.*")
public void receive(String payload) {
LOGGER.info("received payload='{}'", payload);
}
关于对主题名称的程序访问,您可以使用带注释的@Header
方法提取由KafkaHeaders定义的特定标头值,在您的情况下为{ {3}}:
包含接收消息的主题的标题。
@KafkaListener(topics = "com.customer.nike")
public void receive(String payload, @Header(KafkaHeaders.RECEIVED_TOPIC) String topic) {
LOGGER.info("received payload='{}'", payload);
LOG.info("received from topic: {}", topic);
}
答案 1 :(得分:0)
我使用@KafkaListener(topics = "#{'${kafka.topics}'.split(',')}"
,其中kafka.topics
是从我的属性文件中提取的,并且包含用逗号分隔的主题,我的听众应该听这些主题。
但是可能是,在启动过程中,您可以添加逻辑以生成所有可能的主题并分配给变量,该变量以后可以如上使用。
更新:可以使用通配符,如下面的亚历山大评论所述。