ibm-messaging / mq-jms-spring

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

problems with jms client after switching spring boot from 2.7.x to 3.1.x #93

Closed ironWil1 closed 1 year ago

ironWil1 commented 1 year ago

Hi, 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:

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;
        }
    }

I dont have access to queue manager at another side and i know that it wasn't changed or upgraded, but 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').
  org.springframework.jms.support.JmsUtils.convertJmsAccessException(JmsUtils.java:311)
  org.springframework.jms.support.JmsAccessor.convertJmsAccessException(JmsAccessor.java:184)
  org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:510)
  org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:587)
  org.springframework.jms.core.JmsTemplate.convertAndSend(JmsTemplate.java:694)....

  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.wmq.common.internal.Reason.reasonToException(Reason.java:595)
  com.ibm.msg.client.jakarta.wmq.common.internal.Reason.createException(Reason.java:215)
  com.ibm.msg.client.jakarta.wmq.internal.WMQConnection.<init>(WMQConnection.java:458)
  com.ibm.msg.client.jakarta.wmq.factories.WMQConnectionFactory.createV7ProviderConnection(WMQConnectionFactory.java:8683)
  com.ibm.msg.client.jakarta.wmq.factories.WMQConnectionFactory.createProviderConnection(WMQConnectionFactory.java:8023)
  com.ibm.msg.client.jakarta.jms.admin.JmsConnectionFactoryImpl._createConnection(JmsConnectionFactoryImpl.java:322)
  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

How I should solve it?

ibmmqmet commented 1 year ago

closing as dup of https://stackoverflow.com/questions/76573806/problems-with-jms-client-after-switching-spring-boot-from-2-7-x-to-3-1-x-ibm-mq