在 MQ 8.0.0.3 中通过 AMQP/MQ Light 确保交付
Assured delivery over AMQP/MQ Light in MQ 8.0.0.3
我们有一个场景,我们希望 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 选项。
为了应对 Node.js 应用程序在 SAP 应用程序放置消息时离线的情况,您可以在发出 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 中删除.
如您所说,MQ 中的 MQ Light 功能仍处于测试阶段,目前不受 IBM 支持。然而,有一个方向声明说它将在未来成为一个受支持的功能。
我们有一个场景,我们希望 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 选项。
为了应对 Node.js 应用程序在 SAP 应用程序放置消息时离线的情况,您可以在发出 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 中删除.
如您所说,MQ 中的 MQ Light 功能仍处于测试阶段,目前不受 IBM 支持。然而,有一个方向声明说它将在未来成为一个受支持的功能。