使用来自 IBM MQ 的所有消息

问题描述

我想使用来自 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 }));
};