1)我在计算机上启动kafka
2)我使用配置启动我的spring boot服务器:
@Bean
public NewTopic MyTopic() {
return new NewTopic("my-topic", 5, (short) 1);
}
@Bean
public ProducerFactory<String, byte[]> greetingProducerFactory() {
Map<String, Object> configProps = new HashMap<>();
configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, ByteArraySerializer.class);
return new DefaultKafkaProducerFactory<>(configProps);
}
@Bean
public KafkaTemplate<String, byte[]> unpMessageKafkaTemplate() {
return new KafkaTemplate<>(greetingProducerFactory());
}
结果-服务器成功启动,并在kafka中创建my-topic
。
但是,如果我尝试使用远程服务器上的远程kafka进行操作-则无法创建主题。
并在日志弹簧中写入:
12:35:09.880 [ main] [INFO ] o.a.k.clients.admin.AdminClientConfig: [] AdminClientConfig values:
bootstrap.servers = [localhost:9092]
如果我将此bean添加到配置中:
@Bean
public KafkaAdmin admin() {
Map<String, Object> configs = new HashMap<>();
configs.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "remote_host:9092");
return new KafkaAdmin(configs);
}
主题创建成功。
1)为什么会发生?
2)我必须创建KafkaAdmin
吗?为什么不需要本地卡夫卡?
EDDIT
我当前的配置:
spring:
kafka:
bootstrap-servers: remote:9092
producer:
key-serializer: org.apache.kafka.common.serialization.StringDeserializer
value-serializer: org.apache.kafka.common.serialization.ByteArraySerializer
和
@Configuration
public class KafkaTopicConfig {
@Value("${response.topics.topicName}")
private String topicName;
@Bean
public NewTopic responseTopic() {
return new NewTopic(topicName, 5, (short) 1);
}
}
启动后,我看到:
bootstrap.servers = [remote:9092]
client.id =
connections.max.idle.ms = 300000
metadata.max.age.ms = 300000
metric.reporters = []
metrics.num.samples = 2
metrics.recording.level = INFO
metrics.sample.window.ms = 30000
receive.buffer.bytes = 65536
...
但主题未创建
答案 0 :(得分:2)
KafkaAdmin是kafka弹簧对象,用于在您的弹簧上下文中查找NewTopic对象并创建它们。如果您没有KafkaAdmin,将不会进行创建。您可以显式创建KafkaAdmin(如代码段所示),也可以通过spring kafka配置属性间接命令其创建。
KafkaAdmin非常高兴,它与您的应用程序代码的主题的生产或消费无关。
编辑
您一定有什么问题;我刚刚测试过...
spring:
kafka:
bootstrap-servers: remote:9092
和
2019-03-21 09:18:18.354 INFO 58301 --- [ main] o.a.k.clients.admin.AdminClientConfig
: AdminClientConfig values:
bootstrap.servers = [remote:9092]
...
答案 1 :(得分:1)
Spring Boot将自动为您配置KafkaAdmin
,但它使用application.yml(或application.properties)。参见Boot properties。向下滚动到spring.kafka.bootstrap-servers=
。这就是为什么它可以与localhost
(默认)一起使用的原因。
您也不需要ProducerFactory
或模板;引导程序将通过属性为您创建它们。