I've migrated my spring boot app from ver 2.7.8 to 3.1.1 I have switched my client mq-jms-spring-boot-starter from 2.7.5 to 3.1.1
I use:
com.ibm.mq:com.ibm.mq.jakarta.client:9.3.3.0;
com.ibm.mq:mq-jms-spring-boot-starter:3.1.1
Java 17 (Amazon Correto ver. 17.0.6)
this is my JmsConfig:
private static final Integer SESSION_CACHE_SIZE = 500;
private final JMSProperties properties;
@Bean
public MQQueueConnectionFactory mqQueueConnectionFactory() {
MQQueueConnectionFactory mqQueueConnectionFactory = new MQQueueConnectionFactory();
try {
mqQueueConnectionFactory.setHostName(properties.getHost());
mqQueueConnectionFactory.setQueueManager(properties.getQueueManager());
mqQueueConnectionFactory.setPort(properties.getPort());
mqQueueConnectionFactory.setChannel(properties.getChannel());
mqQueueConnectionFactory.setTransportType(WMQConstants.WMQ_CM_CLIENT);
} catch (Exception e) {
throw new RuntimeException("Error occurred while creating connection factory", e);
}
return mqQueueConnectionFactory;
}
@Bean
public UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter(MQQueueConnectionFactory mqQueueConnectionFactory) {
UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter = new UserCredentialsConnectionFactoryAdapter();
userCredentialsConnectionFactoryAdapter.setTargetConnectionFactory(mqQueueConnectionFactory);
userCredentialsConnectionFactoryAdapter.setUsername(properties.getUser());
userCredentialsConnectionFactoryAdapter.setPassword(properties.getPassword());
return userCredentialsConnectionFactoryAdapter;
}
@Bean
public CachingConnectionFactory cachingConnectionFactory(UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter) {
CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory();
cachingConnectionFactory.setTargetConnectionFactory(userCredentialsConnectionFactoryAdapter);
cachingConnectionFactory.setSessionCacheSize(SESSION_CACHE_SIZE);
cachingConnectionFactory.setCacheConsumers(false);
cachingConnectionFactory.setCacheProducers(false);
cachingConnectionFactory.setReconnectOnException(true);
return cachingConnectionFactory;
}
@Bean
public JmsTemplate jmsTemplate(CachingConnectionFactory cachingConnectionFactory) {
JmsTemplate template = new JmsTemplate(cachingConnectionFactory);
template.setReceiveTimeout(properties.getReceiveTimeoutMs());
return template;
}
@Bean
public Jaxb2Marshaller someMarshaller() {
Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
jaxb2Marshaller.setPackagesToScan("somePackages");
jaxb2Marshaller.setMarshallerProperties(Map.of(JAXB_FORMATTED_OUTPUT, true));
return jaxb2Marshaller;
}
After migrating, here i've just changed packages to jakarta namespace for example:
import com.ibm.mq.jakarta.jms.MQQueueConnectionFactory;
import com.ibm.msg.client.jakarta.wmq.WMQConstants;
import static jakarta.xml.bind.Marshaller.JAXB_FORMATTED_OUTPUT;
This is my sender:
private final JmsTemplate jmsTemplate;
public void send(String queue, String message, String correlationId) {
jmsTemplate.convertAndSend(queue, message, new CorrelationIdPostProcessor(correlationId));
}
private static class CorrelationIdPostProcessor implements MessagePostProcessor {
private final String correlationId;
CorrelationIdPostProcessor(String correlationId) {
this.correlationId = correlationId;
}
public Message postProcessMessage(Message message) throws JMSException {
message.setJMSCorrelationID(correlationId);
return message;
}
}
When i try to send message an error occured:
org.springframework.jms.UncategorizedJmsException: Uncategorized exception occurred during JMS processing;
nested exception is com.ibm.mq.MQException: JMSCMQ0001: IBM MQ call failed with compcode '2' ('MQCC_FAILED') reason '2009' ('MQRC_CONNECTION_BROKEN')...
Caused by: com.ibm.msg.client.jakarta.jms.DetailedJMSException: JMSWMQ0018: Failed to connect to queue manager 'WMB02PQM' with connection mode 'Client' and host name 'Client'....
com.ibm.msg.client.jakarta.jms.admin.JmsConnectionFactoryImpl.createConnection(JmsConnectionFactoryImpl.java:242)
com.ibm.mq.jakarta.jms.MQConnectionFactory.createCommonConnection(MQConnectionFactory.java:6026)
com.ibm.mq.jakarta.jms.MQQueueConnectionFactory.createQueueConnection(MQQueueConnectionFactory.java:142)
com.ibm.mq.jakarta.jms.MQQueueConnectionFactory.createConnection(MQQueueConnectionFactory.java:228)
org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter.doCreateConnection(UserCredentialsConnectionFactoryAdapter.java:188)
org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter.createConnection(UserCredentialsConnectionFactoryAdapter.java:162)
org.springframework.jms.connection.SingleConnectionFactory.doCreateConnection(SingleConnectionFactory.java:427)
org.springframework.jms.connection.SingleConnectionFactory.initConnection(SingleConnectionFactory.java:352)
org.springframework.jms.connection.SingleConnectionFactory.getConnection(SingleConnectionFactory.java:327)
org.springframework.jms.connection.SingleConnectionFactory.createConnection(SingleConnectionFactory.java:242)
org.springframework.jms.support.JmsAccessor.createConnection(JmsAccessor.java:196)
org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:497)
Caused by: com.ibm.mq.MQException: JMSCMQ0001: IBM MQ call failed with compcode '2' ('MQCC_FAILED') reason '2009' ('MQRC_CONNECTION_BROKEN').
com.ibm.msg.client.jakarta.wmq.common.internal.Reason.createException(Reason.java:203)
Caused by: com.ibm.mq.jmqi.JmqiException: CC=2;RC=2009;AMQ9204: Connection to host 'myQueueManagerAddress(port)' rejected.
[1=com.ibm.mq.jmqi.JmqiException[CC=2;RC=2009],3=myQueueManagerAddress(port),4=,5=RemoteConnection.asyncConnectionBroken]
com.ibm.mq.jmqi.remote.api.RemoteFAP$Connector.jmqiConnect(RemoteFAP.java:13670)
com.ibm.mq.jmqi.remote.api.RemoteFAP$Connector.access$100(RemoteFAP.java:13202)
com.ibm.mq.jmqi.remote.api.RemoteFAP.jmqiConnect(RemoteFAP.java:1451)
com.ibm.mq.jmqi.remote.api.RemoteFAP.jmqiConnect(RemoteFAP.java:1392)
com.ibm.mq.ese.jmqi.InterceptedJmqiImpl.jmqiConnect(InterceptedJmqiImpl.java:377)
com.ibm.mq.ese.jmqi.ESEJMQI.jmqiConnect(ESEJMQI.java:562)
com.ibm.msg.client.jakarta.wmq.internal.WMQConnection.<init>(WMQConnection.java:391)
Caused by: com.ibm.mq.jmqi.JmqiException: CC=2;RC=2009
I dont have access to queue manager at another side and i know that it wasn't changed or upgraded. At my side i just upgraded gradle file with new versions of libraries and changed namespaces of packages to jakarta. At javax stack with spring boot ver 2.7.8 exchange with queue manager worked perfectly.
How I should solve the problem?