Java 启动springboot服务器时,如何绕过kafka代理故障?

Java 启动springboot服务器时,如何绕过kafka代理故障?,java,spring-boot,web-applications,apache-kafka,Java,Spring Boot,Web Applications,Apache Kafka,我的spring boot(2.1.7.RELEASE)应用程序服务器遇到了一个问题,它使用spring boot Kafka(“spring-Kafka”-“2.2.7.RELEASE”)集成库访问我的Kafka主题 当我的卡夫卡代理关闭时,我的应用程序无法启动 这就是我得到的: 2019-10-06 02:41:02.764 WARN -- [main ] org.apache.kafka.clients.NetworkClient

我的spring boot(2.1.7.RELEASE)应用程序服务器遇到了一个问题,它使用spring boot Kafka(“spring-Kafka”-“2.2.7.RELEASE”)集成库访问我的Kafka主题

当我的卡夫卡代理关闭时,我的应用程序无法启动

这就是我得到的:

2019-10-06 02:41:02.764  WARN -- [main           ] org.apache.kafka.clients.NetworkClient                       [] : [Consumer clientId=consumer-1, groupId=caas] Connection to node -1 could not be established. Broker may not be available.

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2019-10-06 02:41:31.777 ERROR -- [main           ] org.springframework.boot.SpringApplication                   [] : Application run failed

org.springframework.context.ApplicationContextException: Failed to start bean 'org.springframework.kafka.config.internalKafkaListenerEndpointRegistry'; nested exception is org.apache.kafka.common.errors.TimeoutException: Timeout expired while fetching topic metadata
    at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:185)
    at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:53)
    at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:360)
    at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:158)
    at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:122)
    at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:893)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.finishRefresh(ServletWebServerApplicationContext.java:162)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:552)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:743)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:390)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:312)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1214)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1203)
    at com.zinka.fmsclients.FmsClientsApplication.main(FmsClientsApplication.java:14)
Caused by: org.apache.kafka.common.errors.TimeoutException: Timeout expired while fetching topic metadata

有没有办法绕过对卡夫卡经纪人的依赖?我希望我的应用程序启动,即使代理不可用/关闭。一旦代理启动,应用程序服务器应该能够连接。

有一个容器属性
missingtopicsfaltal
: 即使主题和/或代理不可用,也允许应用程序启动

@Bean(name = "kafkaListenerContainerFactory")
public ConcurrentKafkaListenerContainerFactory<?, ?> kafkaListenerContainerFactory(
    ConsumerFactory<Object, Object> kafkaConsumerFactor,
    ConcurrentKafkaListenerContainerFactoryConfigurer configurer) {

  ConcurrentKafkaListenerContainerFactory<Object, Object> factory =
      new ConcurrentKafkaListenerContainerFactory<>();
  configurer.configure(factory, kafkaConsumerFactor);

  ContainerProperties containerProperties = factory.getContainerProperties();
  containerProperties.setMissingTopicsFatal(false);

  ...
  return factory;
}
@Bean(name=“kafkaListenerContainerFactory”)
公共并发kafkaListenerContainerFactory kafkaListenerContainerFactory(
卡夫卡消费工厂,
ConcurrentKafkaListenerContainerFactoryConfigurer(配置器){
ConcurrentKafkalistener集装箱工厂=
新的ConcurrentKafkaListenerContainerFactory();
configurer.configure(工厂,kafkaConsumerFactor);
ContainerProperties ContainerProperties=factory.getContainerProperties();
containerProperties.setMissingTopicsFatal(false);
...
返回工厂;
}

有一个容器属性
缺少TopicsFatal
: 即使主题和/或代理不可用,也允许应用程序启动

@Bean(name = "kafkaListenerContainerFactory")
public ConcurrentKafkaListenerContainerFactory<?, ?> kafkaListenerContainerFactory(
    ConsumerFactory<Object, Object> kafkaConsumerFactor,
    ConcurrentKafkaListenerContainerFactoryConfigurer configurer) {

  ConcurrentKafkaListenerContainerFactory<Object, Object> factory =
      new ConcurrentKafkaListenerContainerFactory<>();
  configurer.configure(factory, kafkaConsumerFactor);

  ContainerProperties containerProperties = factory.getContainerProperties();
  containerProperties.setMissingTopicsFatal(false);

  ...
  return factory;
}
@Bean(name=“kafkaListenerContainerFactory”)
公共并发kafkaListenerContainerFactory kafkaListenerContainerFactory(
卡夫卡消费工厂,
ConcurrentKafkaListenerContainerFactoryConfigurer(配置器){
ConcurrentKafkalistener集装箱工厂=
新的ConcurrentKafkaListenerContainerFactory();
configurer.configure(工厂,kafkaConsumerFactor);
ContainerProperties ContainerProperties=factory.getContainerProperties();
containerProperties.setMissingTopicsFatal(false);
...
返回工厂;
}

这是较新版本的spring的变化

@Component
class ContainerFactoryConfigurer {

    ContainerFactoryConfigurer(ConcurrentKafkaListenerContainerFactory<?, ?> factory) {
        factory.getContainerProperties().setMissingTopicsFatal(false);
    }

}
@组件
类ContainerFactoryConfigurer{
ContainerFactoryConfigurer(ConcurrentKafkaListenerContainerFactory工厂){
factory.getContainerProperties().setMissingTopicsFatal(false);
}
}

这是较新版本的spring的变化

@Component
class ContainerFactoryConfigurer {

    ContainerFactoryConfigurer(ConcurrentKafkaListenerContainerFactory<?, ?> factory) {
        factory.getContainerProperties().setMissingTopicsFatal(false);
    }

}
@组件
类ContainerFactoryConfigurer{
ContainerFactoryConfigurer(ConcurrentKafkaListenerContainerFactory工厂){
factory.getContainerProperties().setMissingTopicsFatal(false);
}
}

Topic not available(主题不可用)和broker not available(代理不可用)是两件不同的事情!!启动spring boot应用程序时,有没有办法绕过检查kafka服务器状态?该应用程序也会在代理不可用时启动,至少在我的kubernetes集群上可以运行。你测试过设置吗?是的,我使用嵌入式和外部tomcat服务器进行了测试。但它不起作用。我们现在还没有使用Kubernetes!!无论如何,我重新测试并验证了SpringBoot2.3仍然可以使用。应用程序启动并开始搜索kafka代理,如果代理可用,则开始使用消息,如果代理消失,则应用程序继续搜索代理。下面是一个工作示例应用程序:谢谢!!我现在用spring boot 2.1.6进行了测试,它可以正常工作。当我开始玩这些属性时,我测试了它,它可能由于其他原因失败。Topic not available(主题不可用)和broker not available(代理不可用)是两个不同的东西!!启动spring boot应用程序时,有没有办法绕过检查kafka服务器状态?该应用程序也会在代理不可用时启动,至少在我的kubernetes集群上可以运行。你测试过设置吗?是的,我使用嵌入式和外部tomcat服务器进行了测试。但它不起作用。我们现在还没有使用Kubernetes!!无论如何,我重新测试并验证了SpringBoot2.3仍然可以使用。应用程序启动并开始搜索kafka代理,如果代理可用,则开始使用消息,如果代理消失,则应用程序继续搜索代理。下面是一个工作示例应用程序:谢谢!!我现在用spring boot 2.1.6进行了测试,它可以正常工作。我测试过,最初当我开始使用这些属性时,它可能因为其他原因而失败。