ibm-messaging / mq-jms-spring

Components to assist MQ JMS integration with Spring frameworks
Apache License 2.0
190 stars 102 forks source link

JMSCC0111 for simple application with two topic listener and without JMS cache #80

Open bjpe opened 2 years ago

bjpe commented 2 years ago

Hi everyone,

I have a Java application using Spring Boot 2.6.3 and mq-jms-spring-boot-starter in version 2.6.3 which subscribes to two durable topics using @JmsListener. When I disable the JMS cache, I get the following exception every 5 seconds:

Could not refresh JMS Connection for destination 'topic1' - retrying using FixedBackOff{interval=5000, currentAttempts=1, maxAttempts=unlimited}. Cause: JMSCC0111: IBM MQ classes for JMS attempted to set a pre-existing client ID on a Connection or JMSContext.

A minimal working example can be found at https://github.com/bjpe/jms-mq-jmscc0111, the application is running against a local MQ started in Docker via

docker run --env LICENSE=accept --env MQ_QMGR_NAME=QM1 --env MQ_APP_PASSWORD=passw0rd --publish 1414:1414 --publish 9443:9443 ibmcom/mq:9.1.5.0-r1

If I either enable com.ibm.mq.jms.SupportMQExtensions or spring.jms-cache, then the exception is not thrown.

Is this a bug or am I missing something here? I would be glad for any help.

Kind Regards, Björn

ibmmqmet commented 2 years ago

The MQ documentation describes that property and how the clientid would normally need to be unique on connections for a standards-compliant program.

Your config yaml file contains a clientid, so that is going to be set on all connections - which breaks the JMS rules, but the MQExtensions property allows you to go ahead anyway. I don't know why turning on caching also gets round it but perhaps it's reduced the number of connections that are getting made.