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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值