使用Spring集成Kafka适配器时spring kafka的动态主题名称配置?

时间:2017-09-29 15:13:44

标签: spring-integration spring-kafka

我有弹簧集成流程,我需要再次重复使用。

@Bean
public IntegrationFlow sendToKafkaFlowRequest(@Value("${kafka.document-consume-topic}") String topic,
                                              ProducerFactory<?, Message> producerFactory) {
    return IntegrationFlows.from("kafkaRequestChannel")
            .handle(Kafka
                    .outboundChannelAdapter(producerFactory)
                    .messageKey(m -> m
                            .getHeaders()
                            .get(IntegrationMessageHeaderAccessor.SEQUENCE_NUMBER))
                    .topicExpression("headers[kafka_topic] ?: '" + topic + "'"))
            .get();
}


@Bean
public IntegrationFlow listeningFromKafkaFlow(@Value("${kafka.document-consume-topic}") String topic,
                                              ConsumerFactory<?, Message> consumerFactory) {
    return IntegrationFlows.from(Kafka.messageDrivenChannelAdapter(consumerFactory, ListenerMode.record, topic)
            .configureListenerContainer(c -> c.ackMode(AbstractMessageListenerContainer.AckMode.RECORD))
            .retryTemplate(new RetryTemplate())
            .filterInRetry(true))
            .channel("interMessageChannel")
            .get();
}

我想一次又一次地重复这两个流程用于多个主题。但问题是主题是硬编码的。 问题是我们可以使用消息的标题在其中放置主题名称吗?这会是一个问题吗 ?

1 个答案:

答案 0 :(得分:0)

行。看,Kafka.messageDrivenChannelAdapter()可以接受几个主题,因此您只需要一个流程。

是的,您始终可以在通过kafka_topic发送给Kafka之前将Kafka.outboundChannelAdapter()标头设置到邮件中。再说一遍:你也不需要在这里复制IntegrationFlow。发送到针对消息解决的主题的唯一一个是完全足够的。