javascript - 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; }
解决方案
是的,你当然可以。
您的应用程序可以获取一条消息,如果它是一条驱动需要完成的工作的消息,则可能使用同步点,完成工作,然后在工作完成后提交获取消息,然后去获取下一条消息。如果需要完成的工作也是事务性的(例如更新数据库),那么可以使用全局事务来同时提交 MQ 消息和其他事务性资源的更新。
您在问题中显示的代码似乎正在浏览消息(使用打开队列,然后使用然后MQOO_BROWSE
读取消息)。我不确定您的应用程序当前如何或何时从队列中删除消息?MQGMO_BROWSE_FIRST
MQGMO_BROWSE_NEXT
您当前的代码似乎已经一一处理消息,因此唯一需要更改的是获取选项(并添加提交调用)。
推荐阅读
- mysql - 处理三重(n 到 n 到 n)关系表的最有效方法是什么?
- java - 如何限制 Google Maps API AutocompleteService 给出超出范围的建议
- javascript - 如何改变一个简单谜题的方向
- esp32 - 无法将原始 ADC1 读数转换为电压
- postgresql - 如何从 Postgres jsonb 对象中删除键数组?
- sql - 对分页符组求和
- python - 我有一个形状为 (601, 2522) 的数据框。我希望索引从数据框的第二行开始
- python - 如何使用 numpy 修复“数组索引过多”错误?
- alexa-skill - Alexa智能家居,模式控制器不工作
- google-cloud-platform - 如何将 Anthos 用于家庭或个人计算资源?