问题描述
我想使用来自 MQ 的所有消息。
public static void main(String[] args)
{
JMSContext context = null;
Destination destination = null;
JMSConsumer consumer = null;
JmsFactoryFactory FF = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
JmsConnectionFactor CF = FF.createConnectionFactory();
context = CF.createContext();
destination = context.createQueue(QUEUE_NAME);
consumer = context.createConsumer(destination);
String msg = consumer.receiveBody(String.class,15090);
System.out.println(msg);
}
它只能读取一条消息。如何消费所有消息?另外,有没有更简单的方法来删除队列中的所有消息,甚至不读取或消耗它们?
解决方法
JMS API 一次使用一条消息,因此您需要将 receiveBody
置于循环中,例如:
public static void main(String[] args) {
JMSContext context = null;
Destination destination = null;
JMSConsumer consumer = null;
JmsFactoryFactory FF = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
JmsConnectionFactor CF = FF.createConnectionFactory();
context = CF.createContext();
destination = context.createQueue(QUEUE_NAME);
consumer = context.createConsumer(destination);
String msg = null;
do {
msg = consumer.receiveBody(String.class,15090);
System.out.println(msg);
} while (msg != null);
}
当 receiveBody
返回 null
时,表示队列中没有更多消息。
JMS API 没有定义从队列中删除所有消息的任何方法,但大多数 JMS 服务器都有一个特定于实现的管理 API,您可以通过它执行这些类型的操作。
,如果,正如您的问题所暗示的,您只想清空队列中的所有消息,而不是在应用程序中实际读取它们,您可以考虑简单地使用管理 MQSC 命令:-
CLEAR QLOCAL(queue-name)
您可以将其输入到 runmqsc
工具中以将其发送给队列管理器。
有没有更简单的方法来删除队列中的所有消息,甚至没有 阅读或消费它们?
是的。您可以使用 MQ PCF 清除队列命令,只要没有应用程序为输入或输出打开队列。即 IPPROCS 和 OPPROCS 必须为零才能工作。这也适用于 Morag 的 MQSC Clear 命令。
这是一个功能齐全的 Java MQ PCF 程序,用于清除队列。
const onPaging = (page: number,column?: string,sortDir?: SortingDirection) => {
const paginatedSearchRequest: SearchApiRequest = {
filter: dataFilter,pageNumber: page,pageSize: pageSize,sortColumn: column,sortDir: sortDir
};
dispatch(getPaginatedSearcgResultAction.started({ request: paginatedSearchRequest }));
};