【发布时间】:2021-05-24 12:02:15
【问题描述】:
我正在尝试访问一些标头,同时以批处理模式使用消息。
如果我设置监听器来处理Message<?>,我可以手动提取标题
@KafkaListener(topics = "${kafka.topic}")
public void receive (List<Message<?> data, Acknowledgment ack) throws SQLException {
for (int i = 0; i < data.size(); ++) {
Object message = data.get(i).getPayload();
MessageHeaders mh = data.get(i).getHeaders();
Object value = mh.get("test");
我想为我完成其中的一些,但是当我尝试时
@KafkaListener(topics = "${kafka.topic}")
public voic receive (List<string> data,
@Header (KafkaHeaders.OFFSET) List<Integer> offsets,
@Header ("test") List<String> testHeaders,
Acknowledgment ack) throws SQLException {
我得到MessageHandlingException: Missing header 'test' for method parameter type [interface.java.util.list]
但是,此方法适用于偏移标头。
这是因为有内置代码来处理标准标题,而这种方法不能用于自定义标题,还是我错过了一些可以使这种方法起作用的东西?
【问题讨论】:
-
你尝试过新鲜的话题吗?也许您发布了没有“测试”标头且您的消费者的
spring.kafka.consumer.auto-offset-reset设置为earliest的早期消息? -
我没有使用
Message<?>代码转储数据,并且每条记录都设置了标题。 -
顺便说一句,请记住,您正在尝试从标头字段中读取字符串列表,但这不是问题。可以分享一下你的制作人吗?
-
还有一个问题……我无权联系制片人。为了转储数据,我使用代码的第一位将其插入数据库,并将标头转换为字符串。我确实尝试在列表中使用不同的类型(
Byte[]、Object、?)但仍然遇到同样的问题。 -
你真的成功打印出你从
mh.get("test")得到的value。我问这个是因为它可能返回 null。
标签: apache-kafka kafka-consumer-api spring-kafka