<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                <mark>在僅開啟了生產者確認機制的情況下,交換機接收到消息后,會直接給消息生產者發送確認消息,如果發現該消息不可路由,那么消息會被直接丟棄,此時生產者是不知道消息被丟棄這個事件的</mark>。 <br/> 那么如何讓無法被路由的消息幫我想辦法處理一下?最起碼通知我一聲,我好自己處理啊。通過在生產者設置`mandatory` 參數可以在當消息傳遞過程中不可到達目的地時將消息返回給生產者。 ```java public class RabbitTemplate extends ... { //mandatory參數 private Expression mandatoryExpression = new ValueExpression(false); ``` <br/> **1. 生產者** ```java @Slf4j @RestController public class ReturnController { public static final String CONFIRM_EXCHANGE_NAME = "confirm.exchange"; @Autowired private RabbitTemplate rabbitTemplate; @Autowired private CustomCallBack customCallBack; /** * @PostConstruct 注解標記的方法可以在項目啟動時時執行一次,這里在項目啟動時 * 注入CustomCallBack對象到RabbitTemplate中去 */ @PostConstruct private void init() { rabbitTemplate.setConfirmCallback(customCallBack); //setMandatory(boolean mandatory) //mandatory=true: 交換機無法將消息進行路由時,會將該消息返回給生產者 //mandatory=false: 如果發現消息無法進行路由,則直接丟棄 rabbitTemplate.setMandatory(true); //設置回退消息交給誰處理 rabbitTemplate.setReturnCallback(customCallBack); } @GetMapping("/return/send") public void sendMessage() { //指定消息id為1 CorrelationData corId = new CorrelationData("1"); //convertAndSend(String exchange, String routingKey, Object object, @Nullable CorrelationData correlationData) rabbitTemplate.convertAndSend(CONFIRM_EXCHANGE_NAME, "key1", "message#key1", corId); log.info("生產消息: {}", "message#key1"); CorrelationData corId2 = new CorrelationData("2"); rabbitTemplate.convertAndSend(CONFIRM_EXCHANGE_NAME, "key2", "message#key2", corId2); log.info("生產消息: {}", "message#key2"); } } ``` **2. 回調對象** ```java @Slf4j @Component public class CustomCallBack implements RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnCallback { /** * 不論交換機是否收到消息該方法都會被調用 * * @param corData 消息相關數據 * @param ack 交換機是否收到消息。true收到、false沒收到 * @param cause 收到或沒收到的理由 */ @Override public void confirm(CorrelationData corData, boolean ack, String cause) { if (ack) { log.info("交換機已收到id={}的消息", corData.getId()); } else { log.info("交換機未收到id={}的消息,原因是:{}", corData.getId(), cause); } } /** * 當消息無法路由到交換機時被調用 * * @param message 消息 * @param replyCode 消息退回代碼 * @param replyText 消息退回原因 * @param exchange 交換機名稱 * @param routingKey 路由key */ @Override public void returnedMessage(Message message, int replyCode, String replyText , String exchange, String routingKey) { log.info("消息被退回 -> message={}, replyCode={}, replyText={}, exchange={}, routingKey={}" , new String(message.getBody()), replyCode, replyText, exchange, routingKey); } } ``` **3. 測試** 啟動項目后訪問 http://localhost:8080/return/send 生產了兩條消息,控制臺輸出如下。 ``` ...] c.l.r.controller.ReturnController : 生產消息: message#key1 ...] c.l.r.controller.ReturnController : 生產消息: message#key2 ...] c.l.rabbitmq03.callback.CustomCallBack : 消息被退回 -> message=message#key2, replyCode=312, replyText=NO_ROUTE , exchange=confirm.exchange, routingKey=key2 ...] c.l.rabbitmq03.callback.CustomCallBack : 交換機已收到id=2的消息 ...] c.l.rabbitmq03.service.ConfirmConsumer : 收到消息: message#key1 ...] c.l.rabbitmq03.callback.CustomCallBack : 交換機已收到id=1的消息 ``` 可見消息 `message#key2` 因為沒有隊列與之綁定無法路由,所以被退回給了生產者。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看