在MQ 8.0.0.3中通过AMQP/MQ Light实现可靠传输

3
我们有一个场景,希望一个 Node.js 应用从一个当前通过 SAP PI 将消息放入 Websphere MQ 队列的后端系统中消费消息。
在 MQ 8.0.0.3 中,有一个 AMQP 支持的 beta 版本。https://www.ibm.com/developerworks/community/blogs/messaging/entry/mq_support_for_mq_light_beta_now_available?lang=en 但是,我找不到确切的答案来保证交付。完美的解决方案是让 Node.js 应用将其订阅注册为持久性订阅,但我该如何做到呢?我们将更改 SAP PI 使用的队列为指向主题的别名队列。使用 Node.js 中的 mqlight 客户端版本 1.0。
1个回答

2
您可以使用MQ Light库在MQ应用程序和Node.js应用程序之间实现可靠的交付。MQ Light支持至少一次的消息传递(不是完全一次),因此在设计解决方案时需要考虑这一点。您需要处理接收到重复消息的情况。
听起来您可能已经阅读了如何将MQ桥接到MQ Light的文章,其中解释了一些MQ队列到主题的选项。
为了应对当SAP应用程序放置消息时Node.js应用程序离线的情况,您可以在发出MQ Light订阅调用时创建一个持久的目标。例如:
// Destination and its messages expire 24 hours after Node.js client disconnects
var options = { qos: mqlight.QOS_AT_LEAST_ONCE, autoConfirm: false, ttl: (60 * 60 * 24 * 1000)};

client.subscribe(pattern, share, options, function(err, pattern) {
  if (err) {
    console.error('Problem with subscribe request: %s', err.message);
    process.exit(1);
  }

  if (pattern) {
    if (share) {
      console.log('Subscribed to share: %s, pattern: %s', share, pattern);
    } else {
      console.log('Subscribed to pattern: %s', pattern);
    }
 }
});

您需要确保您的SAP应用程序发送的消息没有过期时间(即它们设置为MQEI_UNLIMITED)。否则,Node.js应用程序在消费之前,这些消息可能会从目标处过期。
其次,请注意我在上面的示例中如何使用autoConfirm: false。这意味着如果Node.js应用程序从其目标获取一条消息,该消息将不会从目标中删除,直到您在MQ Light应用程序中显式调用message.confirmDelivery()。这允许您确保消息在从MQ中删除之前已在Node.js应用程序中完全处理(例如将其写入文件、数据库或执行其他必要操作)。
正如您所说,MQ中的MQ Light功能仍处于测试阶段,目前未得到IBM的支持。但是,有一份声明表明它将来将成为受支持的功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接