前言
在使用rabbitmq时有时我们需要保证消息有没有成功传递,消息有没有正常到达broker,消息有没有由exchange分配到队列。
一、Publisher-Confirm
Publisher-Confirm是我们验证消息有没有顺利到达rabbit的broker,而之后消息有没有通过exchange路由到队列,不在此次验证的范围。
在spring-rabbitmq实现Publisher-Confirm机制
CachingConnectionFactory设置
开启PublisherConfirms
factory.setPublisherConfirms(true);
异步确认
RabbitTemplate设置
配置Confirm消息确认回调,实现RabbitTemplate.ConfirmCallback中的confirm方法
//消息确认collback
rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
@Override
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
System.out.println(Thread.currentThread().getName());
//
System.out.println("cd:"+correlationData.getId());
System.out.println(ack);
System.out.println(cause);
}
});
confirm方法中correlationData对象,可通过rabbitTemplate.send或convertAndSend传递,里面存放了一个id,
里面有个future对象,通过这个future我们大概能猜出他要实现什么功能。
同步确认
CorrelationData correlationData=new CorrelationData(UUID.randomUUID().toString());
rabbitTemplate.convertAndSend("exchange","Key", object, correlationData);
CorrelationData.Confirm confirm = correlationData.getFuture().get();
调用correlationData.getFuture().get()会等待直到生产者收到ack信号,当然也可以设置timeout。
二、Publisher-Return
上面我面介绍了消息确认机制,但只能保证消息正常到达broker,但不能保证消息有没有正确路由到相应的队列。
Return可以用来验证这一点。
与confirm类似
在spring-rabbitmq实现Publisher-Return机制
CachingConnectionFactory设置
开启PublisherConfirms
factory.setPublisherReturns(true);
RabbitTemplate设置
rabbitTemplate.setMandatory(true);
mandatory代表强制发送,即使exchange找不到routingkey对应的队列也会尝试,如果失败则会回调ReturnCallback
ReturnCallback
实现RabbitTemplate.ReturnCallback.returnedMessage(Message message, int replyCode, String replyText,
String exchange, String routingKey)
rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
@Override
public void returnedMessage(Message message, int replyCode, String replyText,
String exchange, String routingKey) {
....
}
});
replyCode 错误码 312代表没找到队列
replyText 错误信息 NO_ROUT