Spring Cloud Streams没有在消息中设置kafka密钥?

时间:2016-11-10 20:37:16

标签: spring spring-boot apache-kafka spring-cloud spring-cloud-stream

故事是这样的。我有一个kafka经纪人和一个特定的对象(我通过我的主题发表了jsonify),它有一个我想用作密钥的ID。

目前我正在使用'partitionKeyExtractorClass'配置来设置提取ID的类并将其作为键返回。

看起来像这样:

def extractKey(Message<?> message) {
    log.info('Extracting key from message')
    String id = new JsonSlurper().parseText(new String(message.payload)).properties.id
    log.info("Got = ${id}")

    return id
}

我的实际问题是,当我浏览关于主题的消息时,持有我的消息的ConsumerRecord表示密钥为空...

这是一个错误吗?难道我做错了什么?关于这方面的文件不会比这更进一步。

1 个答案:

答案 0 :(得分:1)

看,您正在将partitionkey混合。

目前,KafkaMessageChannelBinder并未提供确定keyMessage的选项。

只有您可以强大使用的现有功能是KafkaHeaders.MESSAGE_KEY

    Object messageKey = this.messageKeyExpression != null
            ? this.messageKeyExpression.getValue(this.evaluationContext, message)
            : message.getHeaders().get(KafkaHeaders.MESSAGE_KEY);

因此,在output消息之前,您应该计算密钥并将其放入该标头中。