生產者發送消息的時候,需要通過exchange+queue,那么這個過程中就可能出現收不到或者是路由不成功的情況。
就需要通過發送返回狀態來進行,完整性的處理。
一般我們在處理實際業務的時候,流程如下:
第一步:先把一些業務處理寫入數據庫
第二步:發送(Producer==>Exchange==>Queue==>Consumer)
能不能發送成功,就需要通過回調來了。
1、配制里加一下。
spring.rabbitmq.publisher-confirm-type=correlated spring.rabbitmq.publisher-returns=true
2、調用包,並且實現。
import org.springframework.amqp.rabbit.core.RabbitTemplate.ConfirmCallback;
import org.springframework.amqp.rabbit.core.RabbitTemplate.ReturnsCallback;
ReturnCallback(過時了) ==> ReturnsCallback
@Component public class mqProducer implements ConfirmCallback,ReturnsCallback {
/**
* 不管成功於否,都會調用。
*/ @Override public void confirm(CorrelationData correlationData, boolean ack, String cause) { System.err.println("correlationData: " + correlationData);
if(ack){
//成功,處理寫庫,更新業務。
}else{
//失敗
} } /** * 如果消息未從路由成功發送到隊列那么會走這個回調,這里會把消息的整個明細返回
* 也就是說出錯了,才會調用哦。 */ @Override public void returnedMessage(ReturnedMessage returned) { System.err.println("ReturnedMessage: " + returned); } }
調用:
rabbitTemplate.setConfirmCallback(this); rabbitTemplate.setReturnsCallback(this); CorrelationData correlationData = new CorrelationData("id_"+System.currentTimeMillis()+""); rabbitTemplate.convertAndSend("exchange1", "queue1", msg, correlationData);
//只要將queue改為不存在,就可以成功調用 returnedMessage。