我正在编写kafka主题的侦听器,并使用@kafkaListener注释执行相同的操作。直到现在,我都硬编码了主题名称(topic1),并且工作正常。这是一个有效的代码:-
@Component
public class KafkaConsumer {
@Autowired
private KafkaProperties kafkaProps;
@Autowired
@Qualifier("CustomObjectMapper")
private ObjectMapper objectMapper;
@KafkaListener(topics = "topic1", containerFactory = "createPokafkaListenerContainerFactory")
public void CreatePoListener(PurchaseOrder po, Acknowledgment ack)
throws JsonProcessingException {
LOG.info("Received message for po create from kafka topic {} is {}",
kafkaProps.getOmsCreateTopicName(), objectMapper
.writerWithDefaultPrettyPrinter().writeValueAsString(po));
ack.acknowledge();
}
}
现在,当我尝试更改代码以从代码中获取主题名称时,它不起作用。在堆栈溢出(How to pass dynamic topic name to @kafkalistener(topics from environment variable)中跟随此页面后,我尝试从代码中获取值的代码是:-
@Component
public class KafkaConsumer {
@Autowired
private KafkaProperties kafkaProps;
public KafkaProperties getKafkaProps() {
return kafkaProps;
}
@Autowired
@Qualifier("CustomObjectMapper")
private ObjectMapper objectMapper;
@KafkaListener(topics = "#{__listener.kafkaProps.getOmsCreateTopicName()}", containerFactory = "omsCreatePokafkaListenerContainerFactory")
public void CreatePoListener(PurchaseOrder po, Acknowledgment ack)
throws JsonProcessingException {
LOG.info("Received message for po create from kafka topic {} is {}",
kafkaProps.getOmsCreateTopicName(), objectMapper
.writerWithDefaultPrettyPrinter().writeValueAsString(po));
ack.acknowledge();
}
}
当我尝试携带服务器时,它会抛出错误:-
Bean初始化失败;嵌套异常为org.springframework.beans.factory.BeanExpressionException:表达式解析失败;嵌套异常是org.springframework.expression.spel.SpelEvaluationException:EL1008E:在类型为“ org.springframework.beans.factory.config.BeanExpressionContext”的对象上找不到属性或字段“ __listener”-可能不是公共的?
有人可以在这里帮助我,我在这里做错了吗?
答案 0 :(得分:2)
1.1.x不再受支持;如果您不能升级到Spring Framework 4.3以上,则应该升级到1.3.10,这是与Spring 4.3一起使用的最新版本。多亏了KIP-62,它的代码模型比1.1.x简单,可靠得多。
虽然您无法将Microsoft.Azure.ServiceBus
与1.3.x一起使用,但是可以使用SpEL表达式直接从__listener
bean中获取主题:
KafkaProperties
答案 1 :(得分:0)
在Consumer类中,您需要进行以下更改:
@Autowired
public KafkaProperties kafkaProps;
@KafkaListener(topics = "#{kafkaConsumer.kafkaProps.getOmsCreateTopicName()}"
对我有用。