这个问题是针对新的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
相同的错误
救命啊!救命啊!
1条答案
按热度按时间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函数。