Spring boot 在方法运行后在Main中显式启动Kafka使用者

Spring boot 在方法运行后在Main中显式启动Kafka使用者,spring-boot,apache-kafka,spring-kafka,Spring Boot,Apache Kafka,Spring Kafka,我有一个spring引导服务,它使用kafka主题。当我消费时,我会对卡夫卡信息执行某些任务。在执行这些操作之前,我需要等待服务将一些数据加载到我设置的缓存中。我的问题是,如果我将kafka consumer设置为autostart,它将在缓存加载并出错之前开始使用 我试图在加载缓存后显式启动使用者,但却出现空指针异常 @配置 公共级卡夫卡康菲{ @值(${kafka.server}”) 字符串服务器; @值(${kafka.port}”) 字符串端口; @值(${kafka.group.id}

我有一个spring引导服务,它使用kafka主题。当我消费时,我会对卡夫卡信息执行某些任务。在执行这些操作之前,我需要等待服务将一些数据加载到我设置的缓存中。我的问题是,如果我将kafka consumer设置为autostart,它将在缓存加载并出错之前开始使用

我试图在加载缓存后显式启动使用者,但却出现空指针异常

@配置
公共级卡夫卡康菲{
@值(${kafka.server}”)
字符串服务器;
@值(${kafka.port}”)
字符串端口;
@值(${kafka.group.id}”)
字符串组ID;
@豆子
公共消费者工厂消费者工厂(){
Map config=newhashmap();
config.put(ConsumerConfig.BOOTSTRAP_SERVERS_config,server+”:“+端口);
config.put(ConsumerConfig.GROUP\u ID\u config,groupid);
config.put(ConsumerConfig.KEY\u反序列化程序\u CLASS\u config,StringDeserializer.CLASS);
config.put(ConsumerConfig.VALUE\u反序列化程序\u CLASS\u config,StringDeserializer.CLASS);
//config.put(“security.protocol”、“SASL_明文”);
//config.put(“sasl.kerberos.service.name”、“kafka”);
返回新的DefaultKafkanConsumerFactory(配置);
}
@豆子
公共ConcurrentKafkaListenerContainerFactory kafkaListenerContainerFactory(){
ConcurrentKafkListenerContainerFactory=新ConcurrentKafkListenerContainerFactory();
setConsumerFactory(consumerFactory());
工厂设置自动启动(错误);
返回工厂;
}
}
卡夫卡

@服务
公共类卡夫卡消费者{
@自动连线
聚合服务聚合服务;
@自动连线
卡夫卡私人登记处;
私人最终会务会务;
公共卡夫卡消费者(反服务反服务){
this.counterService=counterService;
}
@卡夫卡列斯汀(topics=“gliTransactionTopic”,group=“gliDecoupling”,id=“gliKafkaListener”)
公共布尔消耗(字符串消息,
@标头(KafkaHeaders.RECEIVED_PARTITION_ID)整数分区,
@标头(KafkaHeaders.OFFSET)长偏移量)引发异常{
System.out.println(“内部kafka侦听器:“+message+”分区:“+partition.toString()+”偏移:“+offset.toString()”);
aggregationService.run();
返回true;
}
}
启停服务

@服务
公共类解耦控制器{
@自动连线
私有KafkaListenerEndpointRegistry KafkaListenerEndpointRegistry;
公共停车场(){
MessageListenerContainer listenerContainer=kafkaListenerEndpointRegistry
.getListenerContainer(“gliKafkaListener”);
listenerContainer.stop();
}
公开作废开始(){
MessageListenerContainer listenerContainer=kafkaListenerEndpointRegistry
.getListenerContainer(“gliKafkaListener”);
listenerContainer.start();
}
}
主要方法

@springboot应用程序
公共类解耦应用程序{
点燃;
静态缓存映射;
公共静态void main(字符串[]args){
run(DecouplingApplication.class,args);
点火。设置客户端模式(真);
点火=点火。点火(“点火”);
装载缓存(点火);
}
公共静态布尔加载缓存(Ignite Ignite){
mappingsCache=ignite.getOrCreateCache(“mappingsCache”);
mappingsCache.loadCache(null);
System.out.println(“数据加载”);
DecouplingController dc=新的DecouplingController();
dc.start();
返回true;
}
}
以下是例外

    Data Loaded
    Exception in thread "main" java.lang.NullPointerException
        at com.ignite.spring.decoupling.controller.DecouplingController.start(DecouplingController.java:126)
        at com.ignite.spring.decoupling.DecouplingApplication.loadCaches(DecouplingApplication.java:64)
        at com.ignite.spring.decoupling.DecouplingApplication.main(DecouplingApplication.java:37)


在DecouplingApplication中自动连接依赖项,而不是手动创建一个对象
DecouplingController

@Autowired

DecouplingController deDecouplingController;

处理自动连线依赖项的
ApplicationContext
不知道您使用“新建”手动创建的对象。您创建的新
DecouplingController
对象不知道自动连线的
kafkafkalistenerEndpointRegistry

在DecouplingApplication中自动连线依赖项,而不是手动创建
DecouplingController
的对象

@Autowired

DecouplingController deDecouplingController;

处理自动连线依赖项的
ApplicationContext
不知道您使用“新建”手动创建的对象。您创建的新
解耦合控制器
对象不知道自动连线
KafkaFkaListenerEndpointRegistry

似乎未在
ConsumerConfig/ListenerConfig

的某个部分注册gliKafkaListener1
的某个部分注册
ConsumerConfig/ListenerConfig

我做了如下@Autowired static DecouplingController DecouplingController;decouplingController.start();在com.ignite.spring.DecouplingApplication.loadCaches(DecouplingApplication.java:66)的com.ignite.spring.DecouplingApplication.main(DecouplingApplication.java:41)的线程“main”java.lang.NullPointerException中仍然会出现以下异常不要使自动连接变量static它说我必须使它静态,因为我在主springapplication类中调用它@自连线解耦控制器解耦控制器;publicstaticvoidmain(String[]args){SpringApplication.run(DecouplingApplication.class,args);cache.load();decouplingController.start();}我做了以下@autowiredstaticdecouplingcontroller decouplingController;decouplingController.start();仍然在com.ignite上的线程“main”java.lang.NullPointerException中获得以下异常