首页 > 解决方案 > IBM MQ 如何逐条读取消息,而不是一次在队列管理器中全部可用?

问题描述

现在,我的应用程序在队列管理器中接收所有可用消息。我在本地收集并一一处理。我可以将其配置为接收一条消息,做一些工作(可能需要一些时间),删除收到的消息,重复吗?IBM MQ 是否可以实现这种行为?代码已更新

function listenToMQ() {
      const qMgr = inbound.queueManagerName;
      const qName = inbound.queueName;
      const connName = inbound.host;

      const cno = new mq.MQCNO();
      const sco = new mq.MQSCO();
      const csp = new mq.MQCSP();
      const cd = new mq.MQCD();
      cno.SecurityParms = csp;
      csp.UserId = inbound.userID;
      csp.authenticationType = 0;
      cno.Options |= MQC.MQCNO_CLIENT_BINDING;
      cd.ConnectionName = connName;
      cd.ChannelName = inbound.channelName;
      cd.SSLClientAuth = MQC.MQSCA_OPTIONAL;
      cd.MaxMsgLength = 104857600;
      cno.ClientConn = cd;
      cno.SSLConfig = sco;

      mq.setTuningParameters({
        syncMQICompat: true   });

      mq.Connx(qMgr, cno, function(err, hConn) {
        if (err) {
          logger.errorLogger().error(err.message);
        } else {
          const od = new mq.MQOD();
          od.ObjectName = qName;
          od.ObjectType = MQC.MQOT_Q;
          const openOptions = MQC.MQOO_BROWSE;
          mq.Open(hConn, od, openOptions, function(err, hObj) {
            queueHandle = hObj;
            if (err) {
              logger.errorLogger().error(err.message);
            } else {
              getMessages();
            }
          });
        }   }); }


    function getMessages() {
      const md = new mq.MQMD();
      const gmo = new mq.MQGMO();

      gmo.Options =
        MQC.MQGMO_NO_SYNCPOINT |
        MQC.MQGMO_MQWI_UNLIMITED |
        MQC.MQGMO_CONVERT |
        MQC.MQGMO_FAIL_IF_QUIESCING;
      gmo.Options |= MQC.MQGMO_BROWSE_FIRST;

      gmo.MatchOptions = MQC.MQMO_NONE;

      mq.setTuningParameters({
        getLoopPollTimeMs: 500   });   mq.Get(queueHandle, md, gmo, getCB); }



      function getCB(err, hObj, gmo, md, buf, hConn) {
        if (md.Format == "MQSTR") {
          console.log(md);
          const message = decoder.write(buf);
          updateDB(getMetaFeed(message));
        } 
        mq.Cmit(hConn);
      }

            gmo.Options &= ~MQC.MQGMO_BROWSE_FIRST;
            gmo.Options |= MQC.MQGMO_BROWSE_NEXT;   } 

标签: javascriptnode.jsibm-mqmq

解决方案


是的,你当然可以。

您的应用程序可以获取一条消息,如果它是一条驱动需要完成的工作的消息,则可能使用同步点,完成工作,然后在工作完成后提交获取消息,然后去获取下一条消息。如果需要完成的工作也是事务性的(例如更新数据库),那么可以使用全局事务来同时提交 MQ 消息和其他事务性资源的更新。

您在问题中显示的代码似乎正在浏览消息(使用打开队列,然后使用然后MQOO_BROWSE读取消息)。我不确定您的应用程序当前如何或何时从队列中删除消息?MQGMO_BROWSE_FIRSTMQGMO_BROWSE_NEXT

您当前的代码似乎已经一一处理消息,因此唯一需要更改的是获取选项(并添加提交调用)。


推荐阅读