Spring Integration - kafka Outbound适配器不将主题值暴露为spring bean

时间:2017-07-26 18:57:26

标签: spring apache-kafka spring-integration spring-annotations

我已经成功地将kafka outbound channle adapter与固定主题名称集成在一起。现在,我想让主题名称可配置,因此,希望通过应用程序属性公开它。

application.properties包含以下条目之一:

@Configuration
@Component
public class KafkaConfig {

    @Value("${kafkaTopic}")
    private String kafkaTopicName;

    @Bean
    public String getTopic(){
    return kafkaTopicName;
    }

    @Bean
    public KafkaTemplate<String, String> kafkaTemplate() {
        return new KafkaTemplate<>(producerFactory());
    }

    @Bean
    public ProducerFactory<String, String> producerFactory() {
        Map<String, Object> props = new HashMap<>();
        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");//this.brokerAddress);
        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");

        // set more properties
        return new DefaultKafkaProducerFactory<>(props);
    }
}

我的配置类如下所示:

<int-kafka:outbound-channel-adapter
        id="kafkaOutboundChannelAdapter" kafka-template="kafkaTemplate"
        auto-startup="true" sync="true" channel="inputToKafka" topic="getTopic">
    </int-kafka:outbound-channel-adapter>

在我的si-config.xml中,我使用了以下内容(例如:topic =&#34; getTopic&#34;):

topic

但是,通过bean公开时,配置无法获取主题名称。但是当我硬编码主题名称的值时,它工作正常。

有人可以在这里建议我做错了吗?

kafka出站通道中的@media screen and (max-width: 768px) { nav ul { display: none; } 是否接受引用为bean的值?

我如何外化它,因为使用我的实用程序的每个应用程序将提供不同的kafka主题名称

1 个答案:

答案 0 :(得分:0)

topic属性用于字符串值。

但是它支持属性占位符解析:

topic="${kafkaTopic}"

以及上述bean的SpEL评估:

topic="#{getTopic}"

只是因为XML解析器配置允许这样做。

但是,您可能会注意KafkaTemplate注入<int-kafka:outbound-channel-adapter>的{​​{1}}属性defaultTopic。因此,您无需担心该XML。

还有一个可供选择的选项是Spring Integration Annotations配置。您可以在哪里为@ServiceActivator KafkaProducerMessageHandler定义@Bean

@ServiceActivator(inputChannel = "inputToKafka")
@Bean
KafkaProducerMessageHandler kafkaOutboundChannelAdapter() {
     kafkaOutboundChannelAdapter adapter = new kafkaOutboundChannelAdapter( kafkaTemplate());
     adapter.setSync(true);
     adapter.setTopicExpression(new LiteralExpression(this.kafkaTopicName));
     return adapter;
}