我已经成功地将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主题名称
答案 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;
}