通过MQ 8.0.0.3中的AMQP / MQ Light确保交付

时间:2015-09-17 12:53:20

标签: ibm-mq amqp

我们有一个场景,我们希望node.js应用程序使用来自后端系统的消息,后端系统当前将消息放入Websphere MQ队列(通过SAP PI)。

在MQ 8.0.0.3中,有一个AMQP支持测试版。 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 个答案:

答案 0 :(得分:2)

您可以使用MQ Light库在MQ应用程序和Node.js应用程序之间实现可靠的交付。 MQ Light支持至少一次消息传递(不完全一次),因此在设计解决方案时必须牢记这一点。它必须处理接收重复的消息。

听起来你可能已经阅读了article on how to bridge MQ to 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()之前,不会从目标中删除该消息。这允许您确保消息已在Node.js应用程序中完全处理(您已将其写入文件或数据库,或完成任何需要处理的操作),然后再将其从MQ中删除。 / p>

正如您所说,MQ中的MQ Light功能仍处于测试阶段,IBM目前不支持。然而,有一个方向声明表明它将来会成为一个受支持的功能。