Javascript IBM MQ如何逐个读取消息,而不是一次在队列管理器中全部可用?

Javascript IBM MQ如何逐个读取消息,而不是一次在队列管理器中全部可用?,javascript,node.js,ibm-mq,mq,Javascript,Node.js,Ibm Mq,Mq,现在,我的应用程序在队列管理器中接收所有可用消息。我在本地收集并逐一处理。 我是否可以将其配置为接收一条消息,执行一些工作(可能需要一些时间),删除接收到的消息,然后重复?IBM MQ是否可能出现这种行为? 代码已更新 function listenToMQ() { const qMgr = inbound.queueManagerName; const qName = inbound.queueName; const connName = inbound.h

现在,我的应用程序在队列管理器中接收所有可用消息。我在本地收集并逐一处理。 我是否可以将其配置为接收一条消息,执行一些工作(可能需要一些时间),删除接收到的消息,然后重复?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;   } 

是的,你当然可以

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

您在问题中显示的代码似乎正在浏览消息(使用
MQOO\u browse
打开队列,然后使用
MQGMO\u browse\u首先阅读消息
,然后使用
MQGMO\u browse\u下一步阅读消息)。我不确定应用程序当前如何或何时从队列中删除消息


您当前的代码似乎已经在逐个处理消息,因此只需更改get选项(以及添加提交调用)。

当前只需浏览每条消息,调用
applyFeed(消息),然后重复,直到看到最后一条消息。通过浏览不会从队列中删除任何消息。applyFeed函数的作用是什么?如果您删除浏览转基因生物,那么它将从队列中删除每条消息。如果您想等待消息处理完成,请将
MQC.MQGMO_NO_SYNCPOINT
更改为
MQC.MQGMO_SYNCPOINT
,然后在消息处理完成后调用
MQCMIT
。您能否展示一个如何在javascript中使用MQCMIT的示例?是的,目前,应用程序仅浏览消息,不删除。我需要在数据库中保存一条消息,然后删除该消息并处理下一条消息。您能看看这个吗?更新。当我们启动应用程序时,队列可能包含例如10条消息。读取第一条消息,执行数据库更新(可能需要2到4分钟),然后从队列中删除该消息(执行提交),只有在处理完第一条消息后,才能开始处理第二条消息,这一点对我们来说很重要。当前的问题是,我们几乎立即一个接一个地读取消息,我们不会等到数据库更新完成?这不是在您的程序中内联运行吗?这就是为什么它不等待。您的程序正在请求下一条消息,MQ没有将其推送到您的程序,那么为什么您的程序不等到完成DB更新后才请求下一条消息呢?我看到您的代码调用了MQ.Cmit,但您没有使用Syncpoint,所以我不确定这是为了实现什么。我不明白为什么你的代码不处理一条消息并在继续下一条消息之前更新数据库-请你进一步详细说明你看到的导致你相信是这种情况的问题好吗?