我已经使用应用程序属性配置了到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读取消息的有效方法。谢谢。
按照@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);
}
...
}
}