Kafka使用者无法使用Spring Boot 2.2.0.M4连接到localhost:9092以外的代理

时间:2019-07-24 18:22:12

标签: spring-kafka

我正在使用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;
    }

1 个答案:

答案 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);
}