# RabitMQ实战

# 1 消息发送

void basicPublish(String exchange, String routingKey, boolean mandatory, bollean immediate, BasicProperties properties) throws IOException
1

# 1.1 mandantory 参数

要求消息至少路由到一个队列中,否则要么丢弃,要么返回生产者

  • True:匹配不到队列,返回生产者
  • False:匹配不到队列,丢弃

生产者可通过ReturnListenner监听器获取返回生产者的消息

channel.addReturnListener(new ReturnListener(){
  public void handleReturn(int replyCode, String replyText, String exchange, String routingKey, AMOP.BasicProperties properties, byte[] body) throws IOException {
    // ...
  }
})
1
2
3
4
5

# 1.2 immediate参数

要求至少有一个定阅者,否则返回生产者

  • True:路由到队列时,队列上不存在任何消费者,则消息不存入队列。当与路由键匹配的所有队列都没有消费者时,返回给生产者

# 1.3 备份交换器

Mandatory=False,未被路由的消息会被丢弃,如果设置为True,则生产者需要自己处理未被路由的消息。

有另外一种选择,可以使用备份交换器,在需要时再去处理这些消息

  1. 可以在声明交换器时,增加alternate-exchange参数实现
  2. 可以通过策略(Policy)实现
// 定义备份交换器
channel.exchangeDeclare('AlterExchange', 'fanout', true, false, null);

1
2
3
上次更新: : 19 days ago