Spring boot 如何在KafkaListenerContainerFactory创建的KafkaListener类中添加测微计计时器?

Spring boot 如何在KafkaListenerContainerFactory创建的KafkaListener类中添加测微计计时器?,spring-boot,spring-kafka,micrometer,spring-micrometer,Spring Boot,Spring Kafka,Micrometer,Spring Micrometer,当我尝试将注册表自动关联到包含KafkaListener的类时,会出现以下错误- org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'kafkaConsumer' defined in file [/apps/flux-mariadb-pipeline/build/classes/java/main/com/processor/consumer/KafkaConsumer.

当我尝试将注册表自动关联到包含KafkaListener的类时,会出现以下错误-

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'kafkaConsumer' defined in file [/apps/flux-mariadb-pipeline/build/classes/java/main/com/processor/consumer/KafkaConsumer.class]: Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.processor.consumer.KafkaConsumer]: Constructor threw exception; nested exception is java.lang.NullPointerException
    at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:313)
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:294)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1358)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1204)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:557)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:893)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:879)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:551)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1237)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)
    at com.processor.App.main(App.java:10)
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.processor.consumer.KafkaConsumer]: Constructor threw exception; nested exception is java.lang.NullPointerException
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:217)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:117)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:309)
    ... 20 common frames omitted
Caused by: java.lang.NullPointerException: null
    at java.util.Objects.requireNonNull(Objects.java:203)
    at io.micrometer.core.instrument.ImmutableTag.<init>(ImmutableTag.java:35)
    at io.micrometer.core.instrument.Tag.of(Tag.java:29)
    at io.micrometer.core.instrument.Tags.and(Tags.java:74)
    at io.micrometer.core.instrument.Timer$Builder.tag(Timer.java:364)
    at com.processor.consumer.KafkaConsumer.<init>(KafkaConsumer.java:47)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:204)
    ... 22 common frames omitted
org.springframework.beans.factory.BeanCreationException:创建名为“kafkaConsumer”的bean时出错,该名称在文件[/apps/flux-mariadb-pipeline/build/classes/java/main/com/processor/consumer/kafkaConsumer.class]中定义:通过构造函数实例化bean失败;嵌套异常为org.springframework.beans.beanstantiationException:未能实例化[com.processor.consumer.KafkaConsumer]:构造函数引发异常;嵌套异常是java.lang.NullPointerException
位于org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:313)
位于org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:294)
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1358)
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1204)
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:557)
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)
位于org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)
位于org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226)
位于org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)
位于org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
位于org.springframework.beans.factory.support.DefaultListableBeanFactory.PreInstanceSingleton(DefaultListableBeanFactory.java:893)
位于org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:879)
位于org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:551)
位于org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143)
位于org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758)
位于org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750)
位于org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
位于org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
位于org.springframework.boot.SpringApplication.run(SpringApplication.java:1237)
位于org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)
位于com.processor.App.main(App.java:10)
原因:org.springframework.beans.beanstantiationException:未能实例化[com.processor.consumer.KafkaConsumer]:构造函数引发异常;嵌套异常是java.lang.NullPointerException
位于org.springframework.beans.BeanUtils.InstanceClass(BeanUtils.java:217)
位于org.springframework.beans.factory.support.SimpleInstallationStrategy.instantiate(SimpleInstallationStrategy.java:117)
位于org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:309)
... 省略20个公共框架
原因:java.lang.NullPointerException:null
位于java.util.Objects.requirennull(Objects.java:203)
at io.Millimeter.core.instrument.ImmutableTag.(ImmutableTag.java:35)
at io.milumer.core.instrument.Tag.of(Tag.java:29)
at io.milumer.core.instrument.Tags.and(Tags.java:74)
at io.milomer.core.instrument.Timer$Builder.tag(Timer.java:364)
在com.processor.consumer.KafkaConsumer.(KafkaConsumer.java:47)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:423)
位于org.springframework.beans.BeanUtils.InstanceClass(BeanUtils.java:204)
... 省略22个公共帧
卡夫卡消费阶级-

public KafkaConsumer(MeterRegistry meterRegistry) {
  eventTimer =
      Timer.builder("travel.time")
          .description("The time it takes for the event to travel.")
          .tag("topic", topic)
          .publishPercentiles(.30, .65, .99)
          .publishPercentileHistogram()
          .minimumExpectedValue(Duration.ofMillis(1))
          .maximumExpectedValue(Duration.ofMillis(5000))
          .register(meterRegistry);
}

@KafkaListener(
    topics = "${spring.kafka.consumer.properties.topic}",
    groupId = "${spring.kafka.consumer.group-id}")
public void consume(
    ConsumerRecord<String, DataRecord> record,
    @Header(KafkaHeaders.RECEIVED_PARTITION_ID) Integer partition,
    @Header(KafkaHeaders.OFFSET) Long offset,
    Acknowledgment ack)
    throws IOException {
  .
  .
  }
公共卡夫卡消费(计量注册){
事件计时器=
Timer.builder(“旅行时间”)
.description(“事件运行所需的时间”)
.tag(“主题”,主题)
.Publish百分位数(.30、.65、.99)
.publishPercentileHistogram()
.最小预期值(持续时间单位:百万(1))
.最大预期值(持续时间单位:百万(5000))
.登记册(计量登记);
}
@卡夫卡(
topics=“${spring.kafka.consumer.properties.topic}”,
groupId=“${spring.kafka.consumer.groupId}”)
公共消费(
消费者记录,
@标头(KafkaHeaders.RECEIVED_PARTITION_ID)整数分区,
@标题(KafkaHeaders.OFFSET)长偏移,
确认(确认)
抛出IOException{
.
.
}
我正在使用工厂创建KafkaListener容器,如下所示-

@Bean
  public KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<String, String>>
      kafkaListenerContainerFactory() {

    ConcurrentKafkaListenerContainerFactory<String, String> factory =
        new ConcurrentKafkaListenerContainerFactory<>();

    factory.setConsumerFactory(consumerFactory());
    factory.setConcurrency(8);
    factory.getContainerProperties().setAckMode(AckMode.MANUAL_IMMEDIATE);
    factory.setErrorHandler(getErrorHandler());

    return factory;
  }
@Bean
公共卡夫卡利斯特集装箱工厂
kafkaListenerContainerFactory(){
ConcurrentKafkalistener集装箱工厂=
新的ConcurrentKafkaListenerContainerFactory();
setConsumerFactory(consumerFactory());
工厂设置并发(8);
factory.getContainerProperties().setAckMode(AckMode.MANUAL_IMMEDIATE);
setErrorHandler(getErrorHandler());
返回工厂;
}
我发现添加千分尺注册表的唯一方法如下所示

@Bean public ConsumerFactory<String, String> consumerFactory() {
    Map<String, Object> props = kafkaProperties.buildConsumerProperties();

    DefaultKafkaConsumerFactory<String, String> cf = new DefaultKafkaConsumerFactory<>(props);

    cf.addListener(new MicrometerConsumerListener<>(meterRegistry(),
        Collections.singletonList(new ImmutableTag("customTag", "customTagValue"))));

    return cf;
  }
@Bean public ConsumerFactory ConsumerFactory(){
地图道具=卡夫克