記一次kafka併發配置踩到的坑:javax.management.InstanceAlreadyExistsException

12:51:28.426 [pool-1-thread-218] WARN org.apache.kafka.common.utils.AppInfoParser - Error registering AppInfo mbean
javax.management.InstanceAlreadyExistsException: kafka.producer:type=app-info,id=DemoProducer
	at com.sun.jmx.mbeanserver.Repository.addMBean(Repository.java:437)
	at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerWithRepository(DefaultMBeanServerInterceptor.java:1898)
	at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerDynamicMBean(DefaultMBeanServerInterceptor.java:966)
	at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerObject(DefaultMBeanServerInterceptor.java:900)
	at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:324)
	at com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:522)
	at org.apache.kafka.common.utils.AppInfoParser.registerAppInfo(AppInfoParser.java:62)
	at org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:451)
	at org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:304)
	at com.study.kafka.ProducerNew.<init>(ProducerNew.java:36)
	at com.study.kafka.ProducerNew.run(ProducerNew.java:76)
	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中所遇到的問題,針對此問題做一個記錄,根據error log,發現在調用AppInfoParser.registerAppInfo方法時出現的異常,根據error log定位到 Repository.addMBean()截取一部分代碼

上圖中可以得知,一個clientId對應一個,不可重複。

最後找到ProduceNew,發現是因爲自己配置了client.id導致的;如果不配置的話,看KafkaProducer類源碼可知道會爲每一個線程生成一個clientid,"consumer" +  自增id,原子性遞增。

 String clientId = config.getString("client.id");
            if (clientId.length() <= 0) {
                clientId = "producer-" + PRODUCER_CLIENT_ID_SEQUENCE.getAndIncrement();
            }

基於此可知道配置了併發度大於1,同時配置了kafka的 client.id屬性則會出現上述問題,而當你配置爲1的時候不會出現上述log 解決方式:不配置client.id這一項,kakfa中會默認爲多個線程生成id。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章