【发布时间】:2019-10-29 18:06:08
【问题描述】:
我想查找 MQ 的当前队列深度。我的程序可以在队列上读写。
我可以编写一个消费者来消费队列中的消息。我可以使用计数器来计算队列中有多少消息。但我需要在不丢失消息的情况下找到队列深度。
try {
// Create a connection factory
JmsFactoryFactory ff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
JmsConnectionFactory cf = ff.createConnectionFactory();
// Set the properties
cf.setStringProperty(WMQConstants.WMQ_HOST_NAME, HOST);
cf.setIntProperty(WMQConstants.WMQ_PORT, PORT);
cf.setStringProperty(WMQConstants.WMQ_CHANNEL, CHANNEL);
cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
cf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, QMGR);
cf.setStringProperty(WMQConstants.WMQ_APPLICATIONNAME, "JmsPutGet (JMS)");
cf.setBooleanProperty(WMQConstants.USER_AUTHENTICATION_MQCSP, true);
cf.setStringProperty(WMQConstants.USERID, APP_USER);
cf.setStringProperty(WMQConstants.PASSWORD, APP_PASSWORD);
// Create JMS objects
context = cf.createContext();
destination = context.createQueue("queue:///" + QUEUE_NAME);
long uniqueNumber = System.currentTimeMillis() % 1000;
TextMessage message = context.createTextMessage("Your lucky number today is " + uniqueNumber);
producer = context.createProducer();
producer.send(destination, message);
System.out.println("Sent message:\n" + message);
consumer = context.createConsumer(destination); // autoclosable
String receivedMessage = consumer.receiveBody(String.class, 15000); // in ms or 15 seconds
System.out.println("\nReceived message:\n" + receivedMessage);
recordSuccess();
}
代码应该打印队列深度。
【问题讨论】:
-
看来你的问题已经在这里回答了:stackoverflow.com/questions/8660991/…
-
你为什么要这样做?
-
这只是为了学习。我想看看 MQ 服务器有多少条消息。
-
获取队列深度的另一种方法是使用 JMS 浏览器并计算 msgs。但是,获取队列深度并不是应用程序的常见任务。如果您的应用程序是此队列中唯一的应用程序,为什么不立即读取所有消息?无论如何,您将需要它们。如果此队列中还有其他应用,则可能在获取后编号错误(其他应用可能同时添加/删除了消息)