我有一个带有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>
答案 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。
查找设置目标kafka主题的行。这是关键。