我正在使用Spring Boot 2.2.0.M4和Kafka 2.2.0尝试根据https://www.baeldung.com/spring-kafka上的示例来构建应用程序。为主题启用侦听器时,在使用者上出现以下错误。
[AdminClient clientId = adminclient-2]无法建立到节点-1的连接(localhost / 127.0.0.1:9092)。经纪人可能不可用。
以下在我的应用程序属性中定义。
kafka.bootstrapAddress = 172.22.22.55:9092
这是@KafkaListener注释的方法。
@KafkaListener(topics = "add_app", groupId = "foo")
public void listen(String message) {
System.out.println("Received Message in group foo: " + message);
}
下面是引用kafka.bootstrapAddress值的Consumer配置类。它已正确记录。
@Configuration
@Slf4j
public class KafkaConsumerConfig {
@Value(value = "${kafka.bootstrapAddress}")
private String bootstrapAddress;
public ConsumerFactory<String, String> consumerFactory(String groupId) {
Map<String, Object> props = new HashMap<>();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress);
props.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
log.info("Created {} using address {}.", this.getClass(), bootstrapAddress);
return new DefaultKafkaConsumerFactory<>(props);
}
@Bean
public ConcurrentKafkaListenerContainerFactory<String, String> fooKafkaListenerContainerFactory() {
ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(consumerFactory("foo"));
return factory;
}
答案 0 :(得分:1)
解决方案非常简单。我只需要将以下内容添加到application.properties文件。
spring.kafka.bootstrap-servers = 174.22.22.55:9092
在查看KafkaProperties.java之后,我发现以下行:
private List<String> bootstrapServers = new ArrayList<>(Collections.singletonList("localhost:9092"));
,此方法实际上可以构建它们:
private Map<String, Object> buildCommonProperties() {
Map<String, Object> properties = new HashMap();
if (this.bootstrapServers != null) {
properties.put("bootstrap.servers", this.bootstrapServers);
}
if (this.clientId != null) {
properties.put("client.id", this.clientId);
}
properties.putAll(this.ssl.buildProperties());
if (!CollectionUtils.isEmpty(this.properties)) {
properties.putAll(this.properties);
}
return properties;
}
由于该类已经预先定义,因此不使用最初在KafkaConsumerConfig上定义的代理。
更新
将containerFactory属性添加到侦听器批注也将对其进行修复,从而无需更改application.properties。
@KafkaListener(topics = "add_app", groupId = "foo", containerFactory = "fooKafkaListenerContainerFactory")
public void listen(String message) {
System.out.println("Received Message in group foo: " + message);
}