Spring kafkaendpointlistenerregistry.start()引发空指针异常

Spring kafkaendpointlistenerregistry.start()引发空指针异常,spring,apache-kafka,autowired,spring-kafka,Spring,Apache Kafka,Autowired,Spring Kafka,我需要手动启动Kakfa consumer 代码: class Dummy implements ConsumerSeekAware { @Autowired KafkaListenerEndpointRegistry registry; CountDownLatch latch; @Autowired ConcurrentKafkaListenerContainerFactory factory; onIdleEvent(){

我需要手动启动Kakfa consumer

代码:

class    Dummy implements    
        ConsumerSeekAware
{

@Autowired     
KafkaListenerEndpointRegistry registry;

CountDownLatch latch;

@Autowired    
ConcurrentKafkaListenerContainerFactory     factory;

onIdleEvent(){
    latch.countdown()
}       
@KafkaListener(id="myContainer", 
   topics="mytopic",  
  autoStartup="false")    
public void listen() {}


@Scheduled(cron=" some time ")
    void do_some_consumption(){

latch = new CountDownLatch(1);    
this.registry.getListenerContainer("myContainer").start();    
    latch.await();
        do processing


   this.registry.getListenerContainer("myContainer").stop()

}
}
我已经做好了准备 ConcurrentKafkaListenerContainerFactory和我在这里自动连接的其他配置类中的所有道具

然而,当我启动容器时,我得到一个空指针异常 使用此.registry.getListenerContainer(“myContainer”).start()命令


我刚刚把你的代码复制到一个Spring Boot应用程序(自动配置工厂);一切都像预期的那样完美

@springboot应用程序
@使能调度
公共类SO62412316应用程序{
公共静态void main(字符串[]args){
SpringApplication.run(So62412316Application.class,args);
}
@豆子
公共应用程序运行程序(KafkaTemplate模板){
返回参数->{
发送模板(“mytopic”、“foo”);
};
}
@豆子
公共新话题(){
返回TopicBuilder.name(“mytopic”).partitions(1.replications(1.build());
}
}
@组成部分
类Dummy实现ConsumerSekAware{
@自动连线
卡夫卡列斯特登记处;
倒计时闩锁;
@自动连线
卡夫卡利斯特集装箱工厂;
@事件监听器
public void onIdleEvent(ListenerContainerIdleEvent事件){
系统输出打印项次(事件);
倒计时();
}
@KafkaListener(id=“myContainer”,topics=“mytopic”,autoStartup=“false”)
公共void侦听(字符串输入){
系统输出打印项次(输入);
}
@计划(初始延迟=5_000,固定延迟=60_000)
void do_some_consumption()抛出InterruptedException{
闩锁=新的倒计时闩锁(1);
this.registry.getListenerContainer(“myContainer”).start();
satch.wait();
this.registry.getListenerContainer(“myContainer”).stop();
}
}

我刚刚把你的代码复制到一个Spring Boot应用程序(自动配置工厂);一切都像预期的那样完美

@springboot应用程序
@使能调度
公共类SO62412316应用程序{
公共静态void main(字符串[]args){
SpringApplication.run(So62412316Application.class,args);
}
@豆子
公共应用程序运行程序(KafkaTemplate模板){
返回参数->{
发送模板(“mytopic”、“foo”);
};
}
@豆子
公共新话题(){
返回TopicBuilder.name(“mytopic”).partitions(1.replications(1.build());
}
}
@组成部分
类Dummy实现ConsumerSekAware{
@自动连线
卡夫卡列斯特登记处;
倒计时闩锁;
@自动连线
卡夫卡利斯特集装箱工厂;
@事件监听器
public void onIdleEvent(ListenerContainerIdleEvent事件){
系统输出打印项次(事件);
倒计时();
}
@KafkaListener(id=“myContainer”,topics=“mytopic”,autoStartup=“false”)
公共void侦听(字符串输入){
系统输出打印项次(输入);
}
@计划(初始延迟=5_000,固定延迟=60_000)
void do_some_consumption()抛出InterruptedException{
闩锁=新的倒计时闩锁(1);
this.registry.getListenerContainer(“myContainer”).start();
satch.wait();
this.registry.getListenerContainer(“myContainer”).stop();
}
}

将完整堆栈跟踪添加到您的问题中。@GaryRussell已编辑!那不是很有用;如果你能在某个地方发布一个小的、完整的、展示这种行为的项目,我可以看一看。我使用的另一个东西是一个配置类,它包含consumerfactory和Bean定义ConcurrentKafkAlisterContainerFactory ConcurrentKafkAlisterContainerFactory(){}我正在DummyClass中自动连线。将完整堆栈跟踪添加到您的问题中。@GaryRussell已编辑!那不是很有用;如果你能在某个地方发布一个小的、完整的、展示这种行为的项目,我可以看一看。我正在使用的另一个东西是一个配置类,它带有consumerfactory和Bean定义ConcurrentKafkaListenerContainerFactory ConcurrentKafkaListenerContainerFactory(){},我正在DummyClass中自动连接它。谢谢你试用Gary!但是,如果我想在其他类中定义一个消费者和容器工厂bean,它包含与代理、SSL和主题相关的所有道具,该怎么办?我是否需要提供一些其他配置,以便dummy类中的注册表在Config类中注册我的容器工厂;声明工厂
@Bean
的位置并不重要,只要它们存在。也不清楚为什么要在工厂自动布线。正如我所说,你的
虚拟
类对我来说工作正常(没有NPE)。如果你能在某个地方发布一个小的、完整的项目来展示这种行为,我可以看出你做错了什么。谢谢你尝试Gary!但是,如果我想在其他类中定义一个消费者和容器工厂bean,它包含与代理、SSL和主题相关的所有道具,该怎么办?我是否需要提供一些其他配置,以便dummy类中的注册表在Config类中注册我的容器工厂;声明工厂
@Bean
的位置并不重要,只要它们存在。也不清楚为什么要在工厂自动布线。正如我所说,你的
虚拟
类对我来说工作正常(没有NPE)。如果你能在某个地方发布一个小的、完整的项目来展示这种行为,我就能看出你做错了什么。
java.lang.NullPointerException: null
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84)
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
    at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:93)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
spring.kafka.consumer.auto-offset-reset=earliest
spring.kafka.listener.idle-event-interval=5000