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 传递文件