RabbitMQ:计划邮件传递
其背后的主要思想是利用2.8.0中可用的新功能, 即死信交換 。 此AMQP擴(kuò)展允許您在隊(duì)列中指定一個(gè)交換,當(dāng)消息過(guò)期或被拒絕且requeue設(shè)置為false時(shí),應(yīng)將該消息發(fā)布到該隊(duì)列上。
考慮到這一點(diǎn),我們可以為要稍后發(fā)送的消息創(chuàng)建一個(gè)隊(duì)列,將x-message-ttl設(shè)置為我們希望在發(fā)送之前等待的持續(xù)時(shí)間。 為了確保將消息傳輸?shù)搅硪粋€(gè)隊(duì)列,我們??只需將x-dead-letter-exchange定義為我們創(chuàng)建的交換(在這種情況下,我將其稱為即時(shí)交換),并將隊(duì)列綁定到該交換(“ right.now。隊(duì)列”)。
在帶有node-amqp的coffeescript中,這看起來(lái)像這樣:
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}}接下來(lái),我定義立即交換,將隊(duì)列綁定到它并訂閱。
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 msgconsole.log headers最后,在定義了我先前創(chuàng)建的隊(duì)列之后,我們要在其上發(fā)布一條消息。 因此,為了重新訪問(wèn)之前的隊(duì)列定義,我們添加了一個(gè)publish調(diào)用,以直接發(fā)布到隊(duì)列(使用默認(rèn)交換)。
conn.on 'ready', ->conn.queue key, {arguments:{"x-dead-letter-exchange":"immediate", "x-message-ttl": 5000}}, ->conn.publish key, {v:1}, {contentType:'application/json'}運(yùn)行此命令的結(jié)果是我們將等待5秒鐘,然后將消息內(nèi)容和標(biāo)頭轉(zhuǎn)儲(chǔ)到控制臺(tái)。 由于該隊(duì)列僅在這種情況下臨時(shí)使用,因此我還將隊(duì)列的x-expires屬性設(shè)置為在消息過(guò)期后的合理時(shí)間內(nèi)過(guò)期。 這樣可以確保我們不會(huì)在周圍坐滿大量未使用的隊(duì)列。
這是整個(gè)練習(xí)的結(jié)果。
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 msgconsole.log headers您可以在github上完整地獲得此練習(xí)。
這非常有趣,我計(jì)劃在我的生產(chǎn)node.js應(yīng)用程序之一中利用它進(jìn)行進(jìn)一步實(shí)驗(yàn),該應(yīng)用程序使用基于間隔的輪詢來(lái)觸發(fā)計(jì)劃的事件。
參考: 敏捷開(kāi)發(fā)人員博客的Rants and Musings中我們的JCG合作伙伴 James Carr 使用RabbitMQ進(jìn)行的預(yù)定消息傳遞 。
翻譯自: https://www.javacodegeeks.com/2012/04/rabbitmq-scheduled-message-delivery.html
總結(jié)
以上是生活随笔為你收集整理的RabbitMQ:计划邮件传递的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 启动服务命令(启动服务linux)
- 下一篇: 使用Jetty设置JNDI(嵌入式)