1.处理不可路由的消息
如果发布的消息具有设置的“mandatory”标志,但不能传递,代理将返回给发送客户端(通过basic.return AMQP 0-9-1命令)。 为了通知这样的返回,客户可以订阅IModel.BasicReturn事件。 如果没有连接到事件的侦听器,则返回的消息将被静默删除。
model.BasicReturn += new RabbitMQ.Client.Events.BasicReturnEventHandler(...);
例如,如果客户端发布了一条“强制”标志设置为未绑定到队列的“direct”类型交换的消息,则BasicReturn事件将触发。
2.断开与RabbitMQ的连接
要断开连接,只需关闭通道和连接:
channel.Close(200, "Goodbye");
conn.Close();
注意,关闭频道被认为是良好的做法,但不是绝对必要的 - 它将在底层连接关闭时自动完成。 在某些情况下,您可能希望连接在连接上的最后一个打开通道关闭后自动关闭。 要实现这一点,请将IConnection.AutoClose属性设置为true,但仅在创建第一个通道后:
IConnection conn = factory.CreateConnection(...);
IModel channel = conn.CreateModel();
conn.AutoClose = true;
当AutoClose为true时,最后关闭的通道也将导致连接关闭。 如果在创建任何通道之前将其设置为true,则连接将在此时关闭。
3.消息确认
当autoAck参数设置为false,队列中的消息将会被分为两部分:一是等待投递的消息;一是已经投递但是还没有接收到消费者确认信号的消息。
如果消费者一直没有接收到确认信号,并且消费此消息的消费者已经端口连接,则RabbitMQ会安排该消息重新入队,等待下一个消费者,也可能是同一个消费者;
RabbitMQ不会对为确认的消息设置过期时间,所以消费者消费一条消息的时间可能会很长
4.消息拒绝
channel.BasicReject(deliveryTag, requeue);
bool requeue = false;//是否将队列重新入队
bool mutil = false;//是否拒绝接受deliveryTag之前的所有消息,如果设置为false和BasicReject()方法一致
channel.BasicNack(deliveryTag, mutil, requeue);
更多精彩请关注公众号:隔壁王小猿(gbwxy-happy)