Spring集成kafka入站适配器聚合传入消息

时间:2015-08-11 02:44:51

标签: spring-integration apache-kafka

我有int-kafka:outbound-channel-adapter我用来向kafka发送消息,然后使用int-kafka:inbound-channel-adapter接收消息。通信似乎工作正常,我能够发送和接收消息,但格式有点奇怪。我将单独的消息单独发送到我的出站适配器,但是当我收到消息时,我收到一条消息,所有消息都聚合到该消息的有效负载中。

这是我收到消息时消息有效负载的样子

  

[payload = {mytopic = {0 = [string message 1,string message 2,string message 3,string message 4,string message 5,...........]}},headers = {id = 3934de02-1f42-ab90-6aa5-9c15f3cd0b6e,timestamp = 1439260669762}]

接收集成流程如下所示

<int-kafka:inbound-channel-adapter
    id="kafkaInboundAdapter" kafka-consumer-context-ref="consumerContext"
    auto-startup="true" channel="inputFromKafka">
    <int:poller fixed-delay="10" time-unit="MILLISECONDS"
        max-messages-per-poll="5" />
</int-kafka:inbound-channel-adapter>

<int:channel id="inputFromKafka" />

<int:service-activator id="kakfaMessageHandler"
    input-channel="inputFromKafka">
    <bean class="com...broker.MessageHandler"></bean>
</int:service-activator>

我收到在一个spring集成消息中聚合的所有消息而不是在发送到kafka时发送的单独消息的任何原因。

1 个答案:

答案 0 :(得分:0)

before_create被设计为与其他多个轮询KafkaHighLevelConsumerMessageSource一样:通过一次轮询获取数据并将其作为MessageSource<?>返回。

在这种情况下,我们得到了Kafka List<?>的结果:

stream

其中Message<Map<String, Map<Integer, List<Object>>>> 是卡夫卡payload的{​​{1}}以及Maptopic的地图。

如果partition上只使用一个message,则只需将顶级topic转换为consumerContext地图。如果那里只有一个Map,甚至可以直接转换到partition列表。最后你可以得到payload

如果您希望逐个接收主题中的消息,请尽快查看partition