rabbitmq 传递文件
本月初,我在ComoRichWeb上的RabbitMQ上做了一个演讲,与会人员提出的一个问题是“是否可以发布一条消息供以后使用?” 我回答说,就我所知,这是不可能的,但是可能会有一些技巧来实现它。 好吧,今天晚上,在试图弄清楚如何将推送与轮询模型用于定时通知时,我发现了一个使用临时队列,x-message-ttl和死信交换的巧妙技巧。
其背后的主要思想是利用2.8.0中可用的新功能, 即死信交换 。 此AMQP扩展允许您在队列中指定一个交换,当消息过期或被拒绝且requeue设置为false时,消息应发布到该队列上。
考虑到这一点,我们可以为要稍后发送的消息创建一个队列,将x-message-ttl设置为我们希望在发送之前等待的持续时间。 为了确保消息被传输到另一个队列,我们只需将x-dead-letter-exchange定义为我们创建的交换(在这种情况下,我将其称为即时交换),然后将队列绑定到该交换(“ right.now。队列”)。
在带有node-amqp的coffeescript中,这看起来像这样:
amqp = require 'amqp'
conn = amqp.createConnection()
key = "send.later.#{new Date().getTime()}"
conn.on 'ready', ->'
conn.queue key, {
arguments:{
"x-dead-letter-exchange":"immediate"
, "x-message-ttl": 5000
}
}
接下来,我定义立即交换,将队列绑定到它并订阅。
conn.exchange 'immediate'
conn.queue 'right.now.queue', {autoDelete: false, durable: true}, (q) ->
q.bind('immediate', 'right.now.queue')
q.subscribe (msg, headers, deliveryInfo) ->
console.log msg
console.log headers
最后,在定义了我之前创建的队列之后,我们要在其上发布一条消息。 因此,为了重新访问先前的队列定义,我们添加了一个publish调用,以直接发布到队列(使用默认交换)。
conn.on 'ready', ->
conn.queue key, {
arguments:{
"x-dead-letter-exchange":"immediate"
, "x-message-ttl": 5000
}
}, ->
conn.publish key, {v:1}, {contentType:'application/json'}
运行此命令的结果是我们将等待5秒钟,然后将消息内容和标头转储到控制台。 由于该队列仅在此情况下临时使用,因此我还将队列的x-expires属性设置为在消息过期后的合理时间内过期。 这确保了我们不会在周围坐满大量未使用的队列。
这是整个练习的结果。
amqp = require 'amqp'
events = require 'events'
em = new events.EventEmitter()
conn = amqp.createConnection()
key = "send.later.#{new Date().getTime()}"
conn.on 'ready', ->
conn.queue key, {
arguments:{
"x-dead-letter-exchange":"immediate"
, "x-message-ttl": 5000
, "x-expires": 6000
}
}, ->
conn.publish key, {v:1}, {contentType:'application/json'}
conn.exchange 'immediate'
conn.queue 'right.now.queue', {
autoDelete: false
, durable: true
}, (q) ->
q.bind('immediate', 'right.now.queue')
q.subscribe (msg, headers, deliveryInfo) ->
console.log msg
console.log headers
您可以在github上完整地获得此练习。
这非常有趣,我计划在我的生产node.js应用程序之一中利用它进行进一步实验,该应用程序使用基于间隔的轮询来触发计划的事件。
参考: 敏捷开发人员博客的Rants and Musings中我们的JCG合作伙伴 James Carr 使用RabbitMQ进行的预定消息传递 。
翻译自: https://www.javacodegeeks.com/2012/04/rabbitmq-scheduled-message-delivery.html
rabbitmq 传递文件