我如何使用Spring Boot应用程序从IBM MQ读取消息?

问题描述 投票:1回答:1

我已经使用应用程序属性配置了到IBM MQ的连接。如下,

ibm.mq.conn-name=localhost(1415)
ibm.mq.queue-manager=QMGR
ibm.mq.channel=QMGR.SVR.CON.C
ibm.mq.user=xxxxx
ibm.mq.password=xxxxx

我有一个注释为@service的类,该类具有如下从队列中读取消息的方法,

@Service
public class JMSService {
@Inject
private JmsTemplate queueTemplate;

public JmsMessageBean readMessage(String responseQueueName, Logger logger) throws JMSException, Exception {
        JmsMessageBean bean = new JmsMessageBean();
        MQQueue queue = new MQQueue(responseQueueName);
        queue.setTargetClient(WMQConstants.WMQ_CLIENT_NONJMS_MQ);
        queueTemplate.setReceiveTimeout(JmsTemplate.RECEIVE_TIMEOUT_NO_WAIT);
        Message message = queueTemplate.receive(queue);
        if(message!=null){
            String jmsCorrelationID = hexStringToByteArrayToString(message.getJMSCorrelationID());
            bean.setJmsCorrelationID(jmsCorrelationID);
            bean.setMessage(message.getBody(Object.class));
            bean.setJmsMessageID(message.getJMSMessageID());
        }
        return bean;
    }
}

并且我以50毫秒的fixedRate运行调度程序,并在调度程序中调用上述方法,

@Component
public class QueueConnectionService{
@Scheduled(fixedRate = 50)
    public void connectQueueManager() {
        JmsMessageBean bean = null;
        int umacIndex;
        String body = "";
        try {
            bean = jmsService.readMessage(env.getProperty("inwardQueueName"), inwardqueue);

            if (bean != null && bean.getMessage() != null) {

                String messagetxt = "";
                if (bean.getMessage().getClass().getSimpleName().equals("String")) {
                    messagetxt = (String) bean.getMessage();
                } else {
                    byte[] messagebytes = (byte[]) bean.getMessage();
                    messagetxt = new String(messagebytes);
                }
                umacIndex = messagetxt.indexOf("{UMAC:");
                if (umacIndex > 0)
                    message = messagetxt.substring(0, umacIndex);
                else
                    message = messagetxt;
                //sending this message to further processing
            }
        } catch (Exception e) {
            e.printStackTrace();

        }
    }
}

这是可行的,但我确信这不是从队列中读取消息的正确有效的方法,并且在可能存在大量消息时可能是错误的实现。春季TaskSchedulerPool将被重载,因为还有其他数据迁移调度程序。请验证并向我建议从IBM MQ读取消息的有效方法。谢谢。

java spring-boot jms ibm-mq
1个回答
0
投票

按照@JoshMc的建议,您应该使用JmsListener

春天有个好JMS Getting Started Guide。对您来说,它看起来像这样(您可以在提及的Spring指南中看到myFactory的定义):

package hello;

import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;

@Component
public class Receiver {

  @JmsListener(destination = "${inwardQueueName}", containerFactory = "myFactory")
  public void receiveMessage(javax.jms.Message message) {
    String messagetxt = "";
    if (message instanceof javax.jms.TextMessage) {
      messagetxt = message.getBody(String.class);
    }
    ...
  }

}
© www.soinside.com 2019 - 2024. All rights reserved.