IBM MQ node js library 'ibmmq' v2使用SYNCPOINT获取消息

gzjq41n4  于 2023-10-17  发布在  Node.js
关注(0)|答案(1)|浏览(140)

这个问题是针对新的v2版本的'ibmmq' NodeJS包的。在这个版本中有一些breaking changes。所以,老版本的v1的答案不会有帮助!
我试图使用这个包来获取消息,在gmo(获取消息选项)对象中使用MQGMO_SYNCPOINT标志。
例如

// see https://www.ibm.com/docs/en/ibm-mq/9.2?topic=mqgmo-options-mqlong
gmo.Options =
  MQC.MQGMO_SYNCPOINT |
  MQC.MQGMO_WAIT |
  MQC.MQGMO_CONVERT |
  MQC.MQGMO_FAIL_IF_QUIESCING;
gmo.MatchOptions = MQC.MQMO_NONE;
gmo.WaitInterval = this.waitInterval * 1000; // 60 seconds during testing
mq.Get(this.queueHandle, new mq.MQMD(), gmo, this.getMessagesCB);

MQGMO_SYNCPOINT选项确保消息不会从队列中删除,直到我稍后使用mq.Cmit调用提交消息。
但是,当我在回调函数this.getMessagesCB中调用时,例如,

mq.Cmit(this.connectionHandle, function (err) {
  if (err) {
    console.log("Error on commit", err);
  }
});

我得到以下错误:

{
  "name": "MQError",
  "message": "CMIT: MQCC = MQCC_FAILED [2] MQRC = MQRC_HCONN_ASYNC_ACTIVE [2500]",
  "mqcc": 2,
  "mqccstr": "MQCC_FAILED",
  "mqrc": 2500,
  "mqrcstr": "MQRC_HCONN_ASYNC_ACTIVE",
  "version": "2.0.1",
  "verb": "CMIT"
}

使用这个新版本的'ibmmq' NodeJS包,我们必须使用start options之一来调用Ctl方法。我正在使用MQOP_START,如v2版本中包含的示例所示。例如

mq.Ctl(this.connectionHandle, mq.MQC.MQOP_START, function (error) {
  blah blah
})

阅读control callbacks文档说:
MQOP_START为指定连接句柄的所有已定义消息消费者函数启动消息消费。
回调在系统启动的线程上运行,该线程不同于任何应用程序线程。
此操作将所提供的连接句柄的控制权授予系统。除了消费者线程之外,唯一可以由其他线程发出的MQI调用是:

  • 带有MQOP_STOP操作的MQCTL
  • 带有MQOP_SUSPEND操作的MQCTL
  • MQDISC -在断开HConn之前使用操作MQOP_STOP执行MQCTL。

如果在启动连接句柄时发出IBM® MQ API调用,并且该调用不是源自消息使用者函数,则返回MQRC_HCONN_ASYNC_ACTIVE。
所以,我尝试了,在调用mq.Cmit之前,用MQOP_STOP发出一个新的Ctl调用。

mq.Ctl(this.connectionHandle, mq.MQC.MQOP_STOP, function (error) {
  if (error) {
    logError({ msg: `mq.CTL STOP error: ${formatErr(error)}`, error });
  } else {
    logInfo(`initiated MQOP_STOP`);
    mq.Cmit(this.connectionHandle, this.callbackOnCommit);
  }
});

现在我得到一个不同的错误:

libc++abi: terminating due to uncaught exception of type Napi::Error

我还尝试将MQOP_STOP调用替换为MQOP_SUSPEND,并得到与MQOP_STOP相同的错误
救命啊!救命啊!

dzhpxtsq

dzhpxtsq1#

对于未来的读者,这个问题在GitHub上的IBM MQ Messaging存储库中提出,Mark Taylor(IBM MQ nodejs MQI库的作者)提供了建议。问题可以在这里找到:https://github.com/ibm-messaging/mq-mqi-nodejs/issues/169
为了帮助确保上述链接不会在未来的任何时候失效,我还让互联网存档索引页面的wayback机器,现在可以在这里找到:https://web.archive.org/web/20231014005837/https://github.com/ibm-messaging/mq-mqi-nodejs/issues/169
对于一个快速的TL:DR,引用马克从问题:
获取MQRC_HCONN_ASYNC_ACTIVE的根本原因是NodeJS回调函数与真实的C驱动的回调函数不在同一个线程上运行。所以你不能直接从NodeJS回调中调用MQI函数。

相关问题