如何将消息从kafka-sink路由到多个主题

时间:2017-03-28 15:53:00

标签: apache-kafka spring-integration spring-xd kafka-producer-api

我有一个带有http-outbound-gateway的spring-xd http处理器模块,它有一个errorChannel和outputChannel。任何带有HTTP 200的消息都会出现在outputChannel中,其余消息都会出现在failureChannel中。

现在,http处理器模块使用带有TopicX的kafka-outbound-adapter连接到Kafka-Sink。 TopicX仅接收HTTP 200消息以供进一步处理。现在,我们需要将failureChannel中的消息路由到TopicY。

如何在kafka-sink中发送多个kafka主题的消息。我在消息头中有httpStatusCode。我项目中使用的Kafka版本是0.8.2,java版本是1.7

<!-- http-processor-config -->
<int-http:outbound-gateway
        request-channel="input"
        url-expression="'myUrlLink'"
        http-method="POST"
        expected-response-type="java.lang.String"
        charset="UTF-8"
        reply-timeout="10"
        reply-channel="output">

        <int-http:request-handler-advice-chain>
                    <bean class="org.springframework.integration.handler.advice.RequestHandlerRetryAdvice">
                        <property name="recoveryCallback">
                            <bean class="org.springframework.integration.handler.advice.ErrorMessageSendingRecoverer">
                                <constructor-arg ref="errorChannel" />
                            </bean>
                        </property>
                        <property name="retryTemplate" ref="retryTemplate" />
                    </bean>
        </int-http:request-handler-advice-chain>

</int-http:outbound-gateway>


<!-- Handle failed messages and route to failureChannel for specific http codes-->
<int:service-activator input-channel="errorChannel" ref="customErrorHandler" method="handleFailedRequest" output-channel="failureChannel"/>

在Kafka Sink上,我有以下生产者背景:

    <int-kafka:producer-context id="kafkaProducerContext">
    <int-kafka:producer-configurations>
        <int-kafka:producer-configuration broker-list="localhost:9092"
                                          topic="${topicX}"
                                          key-class-type="java.lang.String"
                                          key-serializer="serializer"
                                          value-class-type="[B"
                                          value-serializer="valueSerializer"/>
    </int-kafka:producer-configurations>
</int-kafka:producer-context>

2 个答案:

答案 0 :(得分:1)

这是真的,它不受支持,也不会成功。 Spring XD已经是今年的EOL了。我们鼓励每个人都迁移到Spring Cloud Data Flow

对于您的用例,您可以编辑Kafka Sink模块配置。为另一个主题再添加一个<int-kafka:outbound-channel-adapter>。要确定将传入消息发送到哪个主题,您可以将<router>添加到此配置。

或者只考虑使用Router Sink。每个消息类型都有两个独立的流,因此每个主题都有。

答案 1 :(得分:1)

我终于开始工作了。现在我通过在http处理器模块中添加一个拆分器找到了0.8.x版本的解决方法,并在消息头中添加了一个kafka_topic变量。基于Http状态代码,我只是设置不同的主题。

在Kafka-sink上,我添加了另一个带有新主题名称变量的生成器配置,通过XD参数设置。我无法想到任何其他解决方案,因为我在多个流中重用kafka-source和kafka-sink模块。

此特定kafka-sink将输入发送到另一个XD流。因此,添加了一个header-filter,以便在下一个流启动时删除kafka-source模块中的kafka_topic。

阅读更多内容: http://docs.spring.io/autorepo/docs/spring-kafka-dist/1.0.2.RELEASE/reference/html/_spring_integration.html

查找设置目标kafka主题的行。这是关键。