TTL(Time-To-Live and Expiration)

RabbitMQ既能对队列设置TTL也能对消息设置TTL,消息TTL可以应用于单个队列、一组队列或应用于逐个消息。

如何给消息设置TTL?

rabbitmqctl rabbitmqctl set_policy TTL ".*" '{"message-ttl":60000}' --apply-to queues
rabbitmqctl (Windows) rabbitmqctl set_policy TTL ".*" "{""message-ttl"":60000}" --apply-to queues

或者

byte[] messageBodyBytes = "Hello, world!".getBytes();
AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
.expiration("60000")
.build();
channel.basicPublish("my-exchange", "routing-key", properties, messageBodyBytes);

如何给队列设置TTL?

rabbitmqctl rabbitmqctl set_policy expiry ".*" '{"expires":1800000}' --apply-to queues
rabbitmqctl (Windows) rabbitmqctl.bat set_policy expiry ".*" "{""expires"":1800000}" --apply-to queues

或者:

Map<String, Object> args = new HashMap<String, Object>();
args.put("x-message-ttl", 60000);
channel.queueDeclare("myqueue", false, false, false, args);

死信队列:跟死信交换机绑定的队列

死信交换机:

当以下的任意情况发生的时候,意味着队列中的该消息变成了死信

  1. 消费者调用了basic.reject/basic.nack 并且设置requeuefalse(不重回队列)的时候,消息就会进入死信队列 。
  2. 消息有效期过期。
  3. 队列达到最大的长度,并且我们没有设置自动拒绝消息的时候,队首的消息就会进入死信队列 。

死信交换机其实就是一个正常的交换机,我们可以像申明一个正常交换机一样申明它。

怎么给队列申明死信交换机?

rabbitmqctl rabbitmqctl set_policy DLX ".*" '{"dead-letter-exchange":"my-dlx"}' --apply-to queues
rabbitmqctl (Windows) rabbitmqctl set_policy DLX ".*" "{""dead-letter-exchange"":""my-dlx""}" --apply-to queues

或者:

channel.exchangeDeclare("some.exchange.name", "direct");

Map<String, Object> args = new HashMap<String, Object>();
args.put("x-dead-letter-exchange", "some.exchange.name");
channel.queueDeclare("myqueue", false, false, false, args);

我们也可以给这个交换机申明routingKey:

args.put("x-dead-letter-routing-key", "some-routing-key");

利用TTL跟死信交换机我们可以实现消息的延时处理:

大致思路如下:

  1. 声明一个延时处理的队列

    其实就是在申明队列的时候指定消息的存活时间,伪代码如下:

    map.put("x-message-ttl", delayTime);
  2. 在申明这个队列时,同时指定死信交换机跟RoutingKey

     map.put("x-dead-letter-exchange", "dead-exchange");
    map.put("x-dead-letter-routing-key", "dead");
    queueDeclare("delay-queue", true, false, false, map)
  3. 申明一个队列跟死信交换机绑定,作为死信队列

    queueDeclare("dead-queue", true, false, false, null)
    queueBind("dead-queue", "dead-exchange", "dead", null)

最新文章

  1. hdu 4481 Time travel(高斯求期望)(转)
  2. ORACLE如何比较两个数据库的差异
  3. PHP语言基础简单整理
  4. 公用表表达式(CTE)递归的生成帮助数据
  5. svg绘制圆弧
  6. BFS+Hash(储存,判重) HDOJ 1067 Gap
  7. Knockoutjs实例 - 属性绑定(Bindings)之流程控制(Control flow)
  8. [转]jQuery Popup Login and Contact Form
  9. HTML ---滚动条样式代码及&lt;marquee&gt;标签的用法;
  10. BC Harry and Magical Computer (拓扑排序)
  11. Bourn Again Shell编程
  12. Object对象
  13. 如何简单的实现新手引导之UGUI篇
  14. tf.estimator.Estimator类的用法
  15. 数据库与java的连接
  16. [SQL]注释
  17. 【git】日志提交规范
  18. Ubuntu 18 开机启动慢
  19. 2018.10.15 bzoj4445: [Scoi2015]小凸想跑步(半平面交)
  20. IDEA中java文件的左下角有个像乐符一样的J符号

热门文章

  1. Gallery实现图片拖动切换
  2. 对于之间不平凡的我,为什么会选择IT!(上)
  3. CSS躬行记(6)——滤镜
  4. python 3 的解释器
  5. 如何教零基础的人认识Python
  6. Leetcode1353-最多可以参加的会议数目
  7. timer和ScheduledThreadPoolExecutor定时任务和每日固定时间执行
  8. 磁盘性能测试工具之fio
  9. windows 系统使用技巧
  10. 数值计算方法实验之Hermite 多项式插值 (Python 代码)