java - 如何正确接收来自队列 IBM MQ 的消息
问题描述
这段代码应该从队列中读取,如果队列为空,则通过计时器重复读取,检查文本或字节的格式。这种格式检查空队列是否正确?在这种情况下计时器会起作用吗?由于未配置 MQ 队列,因此无法检查。
public class Main {
public static void main(String[] args) {
boolean tru = true;
try {
/*MQ Конфигурация подключения*/
MQQueueConnectionFactory mqQueueConnectionFactory = new MQQueueConnectionFactory();
mqQueueConnectionFactory.setHostName("localhost");
mqQueueConnectionFactory.setChannel("SVRCONN");
mqQueueConnectionFactory.setPort(1414);
mqQueueConnectionFactory.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
mqQueueConnectionFactory.setQueueManager("MQ_APPLE");
mqQueueConnectionFactory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP);
QueueConnection queueConnection = mqQueueConnectionFactory.createQueueConnection("name", "pass");
MQQueueSession session = (MQQueueSession) queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
MQQueue queue = (MQQueue) session.createQueue("queue:///Q1");
MQQueueReceiver receiver = (MQQueueReceiver) session.createReceiver(queue);
queueConnection.start();
while(tru){
TextMessage receivedMessage = (TextMessage) receiver.receive();
if(receivedMessage != null){
MStart(receivedMessage);
tru = false;
} else {
Timer timer = new Timer(10000,new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
System.out.println("Timer Run");
}
});
timer.start();
}
}
receiver.close();
session.close();
queueConnection.close();
} catch (JMSException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void MStart(TextMessage receivedMessage) throws JMSException {
if (receivedMessage instanceof BytesMessage) {
TextMessage textMessage = (TextMessage) receivedMessage;
System.out.println("Received message '"
+ textMessage.getText() + "'");
} else if (receivedMessage instanceof TextMessage) {
System.out.println("Received message: " + receivedMessage.getText());
}
}
}
解决方案
请注意,您的receiver.receive();
通话将无限期阻塞。来自MQMessageConsumer
文档:
接收为此消息使用者生成的下一条消息。此调用将无限期阻塞,直到生成消息或关闭此消息使用者。
如果您想在指定的时间内从队列中读取,也许您应该更好地使用该receive(long timeout)
方法:
公共 javax.jms.Message 接收(长时间超时)抛出 javax.jms.JMSException
接收在指定超时间隔内到达的下一条消息。此调用阻塞,直到消息到达、超时到期或此消息使用者关闭。零超时永不过期,并且调用无限期阻塞。
推荐阅读
- python - 如何跟踪dict中的下一项(递归循环)
- c - 有没有办法从有序条款中取消?
- python - 如何以组织图表的方式绘制有向图?
- android - 如何修复“活动已泄漏 ServiceConnection net.openid.appauth.browser.CustomTabManager$1@41fb56d0 最初绑定在这里”错误
- scroll - 试图限制手风琴内动态生成的行列表以滚动显示在固定高度的卡片中
- ajax - Ajax 在位置 0 的 JSON 中得到错误解析错误和 Unexpected token <?
- android - 无法将 JSONObject 转换为 JSONArray
- c# - 当我在 getresponsedata 上设置断点时,代码运行良好,但没有断点则无法运行
- javascript - 如何将 React Native 自定义警报作为函数调用?
- javascript - 每个调用方法的 Javascript 计数器