ibm-mq - 在 MQ 8.0.0.3 中通过 AMQP/MQ Light 确保交付

标签 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

最佳答案

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

听起来您可能已经阅读了 article on how to bridge MQ to MQ Light其中解释了一些 MQ queue-to-topic 选项。

为了应对 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 支持。但是,有一个方向声明说它将在未来成为受支持的功能。

关于ibm-mq - 在 MQ 8.0.0.3 中通过 AMQP/MQ Light 确保交付,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32630796/

相关文章:

java - C/C++ 中的 MQ JMS 主题等价物

java - 在 WildFly for IBM MQ 上部署 MDB 因连接错误而失败

具有多个 URI 的 RabbitMQ 连接

rabbitmq - 我可以在 RabbitMQ 上进行可靠的“发送后忘记”操作吗?

java - RabbitTemplate.send() 是否保证将消息传递到 RabbitMQ?

performance - ActiveMQ 5.10/QPid 0.28/AMQP 1.0性能问题

soa - 为 Oracle SOA MQ 系列适配器创建和配置 Websphere MQ

ibm-mq - 使用 websphere MQ 作为 XA 事务协调器

java - 如何从 Java 获取连接到 Websphere MQ 队列的消费者数量

java - Spring AMQP java客户端和RabbitMQ集群节点之间的负载平衡连接?