Skip to content

Multiple Listeners throws javax.management.InstanceAlreadyExistsException #398

@collabintel

Description

@collabintel

I get javax.management.InstanceAlreadyExistsException when I have multiple listeners. It works fine in 1.2.2.RELEASE, but throws this exception in 1.3.0.M1 version or 1.3.0.BUILD-SNAPSHOT. I think the problem is consumers don't get a generated id like 'consumer-1', 'consumer-2':

javax.management.InstanceAlreadyExistsException: kafka.consumer:type=app-info,id=null-0
 	at com.sun.jmx.mbeanserver.Repository.addMBean(Repository.java:437) ~[na:1.8.0_111]
 	at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerWithRepository(DefaultMBeanServerInterceptor.java:1898) ~[na:1.8.0_111]
 	at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerDynamicMBean(DefaultMBeanServerInterceptor.java:966) ~[na:1.8.0_111]
 	at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerObject(DefaultMBeanServerInterceptor.java:900) ~[na:1.8.0_111]
 	at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:324) ~[na:1.8.0_111]
 	at com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:522) ~[na:1.8.0_111]
 	at org.apache.kafka.common.utils.AppInfoParser.registerAppInfo(AppInfoParser.java:58) ~[kafka-clients-0.11.0.0.jar!/:na]
 	at org.apache.kafka.clients.consumer.KafkaConsumer.<init>(KafkaConsumer.java:757) [kafka-clients-0.11.0.0.jar!/:na]
 	at org.apache.kafka.clients.consumer.KafkaConsumer.<init>(KafkaConsumer.java:602) [kafka-clients-0.11.0.0.jar!/:na]
 	at org.springframework.kafka.core.DefaultKafkaConsumerFactory.createKafkaConsumer(DefaultKafkaConsumerFactory.java:118) [spring-kafka-1.3.0.BUILD-SNAPSHOT.jar!/:na]
 	at org.springframework.kafka.core.DefaultKafkaConsumerFactory.createKafkaConsumer(DefaultKafkaConsumerFactory.java:113) [spring-kafka-1.3.0.BUILD-SNAPSHOT.jar!/:na]
 	at org.springframework.kafka.core.DefaultKafkaConsumerFactory.createConsumer(DefaultKafkaConsumerFactory.java:93) [spring-kafka-1.3.0.BUILD-SNAPSHOT.jar!/:na]
 	at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.<init>(KafkaMessageListenerContainer.java:320) [spring-kafka-1.3.0.BUILD-SNAPSHOT.jar!/:na]
 	at org.springframework.kafka.listener.KafkaMessageListenerContainer.doStart(KafkaMessageListenerContainer.java:192) [spring-kafka-1.3.0.BUILD-SNAPSHOT.jar!/:na]
 	at org.springframework.kafka.listener.AbstractMessageListenerContainer.start(AbstractMessageListenerContainer.java:202) [spring-kafka-1.3.0.BUILD-SNAPSHOT.jar!/:na]
 	at org.springframework.kafka.listener.ConcurrentMessageListenerContainer.doStart(ConcurrentMessageListenerContainer.java:125) [spring-kafka-1.3.0.BUILD-SNAPSHOT.jar!/:na]
 	at org.springframework.kafka.listener.AbstractMessageListenerContainer.start(AbstractMessageListenerContainer.java:202) [spring-kafka-1.3.0.BUILD-SNAPSHOT.jar!/:na]
 	at org.springframework.kafka.config.KafkaListenerEndpointRegistry.startIfNecessary(KafkaListenerEndpointRegistry.java:287) [spring-kafka-1.3.0.BUILD-SNAPSHOT.jar!/:na]
 	at org.springframework.kafka.config.KafkaListenerEndpointRegistry.start(KafkaListenerEndpointRegistry.java:236) [spring-kafka-1.3.0.BUILD-SNAPSHOT.jar!/:na]
 	at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:175) [spring-context-4.3.8.RELEASE.jar!/:4.3.8.RELEASE]
 	at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:50) [spring-context-4.3.8.RELEASE.jar!/:4.3.8.RELEASE]
 	at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:348) [spring-context-4.3.8.RELEASE.jar!/:4.3.8.RELEASE]
 	at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:151) [spring-context-4.3.8.RELEASE.jar!/:4.3.8.RELEASE]
 	at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:114) [spring-context-4.3.8.RELEASE.jar!/:4.3.8.RELEASE]
 	at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:879) [spring-context-4.3.8.RELEASE.jar!/:4.3.8.RELEASE]
 	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.finishRefresh(EmbeddedWebApplicationContext.java:144) [spring-boot-1.5.3.RELEASE.jar!/:1.5.3.RELEASE]
 	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:545) [spring-context-4.3.8.RELEASE.jar!/:4.3.8.RELEASE]
 	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) [spring-boot-1.5.3.RELEASE.jar!/:1.5.3.RELEASE]
 	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737) [spring-boot-1.5.3.RELEASE.jar!/:1.5.3.RELEASE]
 	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370) [spring-boot-1.5.3.RELEASE.jar!/:1.5.3.RELEASE]
 	at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) [spring-boot-1.5.3.RELEASE.jar!/:1.5.3.RELEASE]
 	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1162) [spring-boot-1.5.3.RELEASE.jar!/:1.5.3.RELEASE]
 	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1151) [spring-boot-1.5.3.RELEASE.jar!/:1.5.3.RELEASE]
 	at org.micro.commerce.product.ProductCommandApplication.main(ProductCommandApplication.java:10) [classes!/:na]
 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_111]
 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_111]
 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_111]
 	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_111]
 	at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) [app.jar:na]
 	at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) [app.jar:na]
 	at org.springframework.boot.loader.Launcher.launch(Launcher.java:50) [app.jar:na]
 	at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51) [app.jar:na]
@Component
public class ProductEventsConsumer {

    private static final Logger LOGGER = LoggerFactory.getLogger(ProductEventsConsumer.class);

    private final CountDownLatch latch1 = new CountDownLatch(1);

    private final CountDownLatch latch2 = new CountDownLatch(1);

    private final CountDownLatch latch3 = new CountDownLatch(1);

    @KafkaListener(topics = "${kafka.topic.product-creation-requested}")
    public void receiveProductCreationRequestedEvent(ProductCreationRequestedEvent event) {
        LOGGER.info("isProductCreationRequestedEvent: " + (event instanceof ProductCreationRequestedEvent) + " received payload='{}'", event.getModel());
        latch1.countDown();
    }

    @KafkaListener(topics = "${kafka.topic.product-creation-validated}")
    public void receiveProductCreationValidatedEvent(ProductCreationValidatedEvent event) {
        LOGGER.info("isProductCreationValidatedEvent: " + (event instanceof ProductCreationValidatedEvent) + " received payload='{}'", event.getModel());
        latch2.countDown();
    }

    @KafkaListener(topics = "${kafka.topic.product-created}")
    public void receiveProductCreatedEvent(ProductCreatedEvent event) {
        LOGGER.info("isProductCreatedEvent: " + (event instanceof ProductCreatedEvent) + " received payload='{}'", event.getModel());
        latch3.countDown();
    }

}
@Configuration
@EnableKafka
public class EventsConsumerConfiguration {

    @Value("${kafka.bootstrap-servers}")
    private String bootstrapServers;

    @Bean
    public Map<String, Object> consumerConfigs() {
        Map<String, Object> props = new HashMap<>();
        // list of host:port pairs used for establishing the initial connections to the Kakfa cluster
        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
        props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        // allows a pool of processes to divide the work of consuming and processing records
        props.put(ConsumerConfig.GROUP_ID_CONFIG, "product-command-events");

        return props;
    }

    @Bean
    public ConsumerFactory<String, String> consumerFactory() {
        return new DefaultKafkaConsumerFactory<>(consumerConfigs());
    }

    @Bean
    public ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerContainerFactory() {
        ConcurrentKafkaListenerContainerFactory<String, String> factory =
                new ConcurrentKafkaListenerContainerFactory<>();
        factory.setConsumerFactory(consumerFactory());
        factory.setMessageConverter(new StringJsonMessageConverter());

        return factory;
    }


}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions