Mohit Anand
Mohit Anand

Reputation: 41

Spring Boot + IBM MQ - Handle Correlation id

i'm getting messages from the remote IBM MQ queue in my java spring boot application .I need to send back the processed message. How do i set the correlation id of response i'm sending back to the queue.

Mq Config

@Bean
public MQQueueConnectionFactory mqQueueConnectionFactory()  {

    MQQueueConnectionFactory mqQueueConnectionFactory = new MQQueueConnectionFactory();
    mqQueueConnectionFactory.setHostName(host);
    try {
        mqQueueConnectionFactory.setTargetClientMatching(true);
        mqQueueConnectionFactory.setCCSID(1208);
        mqQueueConnectionFactory.setTransportType(WMQConstants.WMQ_CM_CLIENT);
        mqQueueConnectionFactory.setChannel(channel);
        mqQueueConnectionFactory.setPort(port);
        mqQueueConnectionFactory.setQueueManager(queueManager);


    } catch (Exception e) {
        e.printStackTrace();
        System.out.println(e.getStackTrace().toString());
        logger.error("MqQueueConnectionFactory ", e);
    }
    return mqQueueConnectionFactory;
}

@Bean
UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter(
        MQQueueConnectionFactory mqQueueConnectionFactory) {
    UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter = new UserCredentialsConnectionFactoryAdapter();
    userCredentialsConnectionFactoryAdapter.setUsername(username);
    userCredentialsConnectionFactoryAdapter.setPassword(password);
    userCredentialsConnectionFactoryAdapter.setTargetConnectionFactory(mqQueueConnectionFactory);
    return userCredentialsConnectionFactoryAdapter;
}

@Bean
@Primary
public CachingConnectionFactory cachingConnectionFactory(
        UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter) {
    CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory();
    cachingConnectionFactory.setTargetConnectionFactory(userCredentialsConnectionFactoryAdapter);
    cachingConnectionFactory.setSessionCacheSize(500);
    cachingConnectionFactory.setReconnectOnException(true);
    return cachingConnectionFactory;
}

@Bean
public PlatformTransactionManager jmsTransactionManager(CachingConnectionFactory cachingConnectionFactory) {
    JmsTransactionManager jmsTransactionManager = new JmsTransactionManager();
    jmsTransactionManager.setConnectionFactory(cachingConnectionFactory);
    return jmsTransactionManager;
}

@Bean
public JmsOperations jmsOperations(CachingConnectionFactory cachingConnectionFactory) {
    JmsTemplate jmsTemplate = new JmsTemplate(cachingConnectionFactory);
    jmsTemplate.setReceiveTimeout(receiveTimeout);
    return jmsTemplate;
}

@Bean
public JmsListenerContainerFactory<?> myFactory(CachingConnectionFactory cachingConnectionFactory,
        DefaultJmsListenerContainerFactoryConfigurer configurer) {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    configurer.configure(factory, cachingConnectionFactory);
    return factory;
}

@Bean
public MessageConverter jacksonJmsMessageConverter() {
    MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
    converter.setTargetType(MessageType.TEXT);
    converter.setTypeIdPropertyName("_type");
    converter.setObjectMapper(getObjectMapper());
    return converter;
}

i am using annotations to recieve message from the queue and send back. but i need to set the correlation id of the response = message id of request.

@JmsListener(destination = "destination", containerFactory = "myFactory")
@SendTo("desination")
public void onMessage(Message message)

Any Suggestion?

Upvotes: 2

Views: 3107

Answers (1)

bravo1
bravo1

Reputation: 69

Sorry, I am little late )

@JmsListener(destination = "destination", containerFactory = "myFactory")
@SendTo("desination")
public Message onMessage(Message requestMessage, Session session) throws JMSException {
    ...
    Message responseMessage = jacksonJmsMessageConverter.toMessage(responsePojo, session);
    responseMessage.setJMSCorrelationID(requestMessage.getJMSCorrelationID());
    return responseMessage;
}

Upvotes: 0

Related Questions