rabbitMQ-死信

1.什么是死信(Dead Letter)屠尊?

官方文檔:https://www.rabbitmq.com/dlx.html

一個(gè)消息變成死信的條件有:

1.消費(fèi)被拒絕(basic.reject 或者 basic.nack)捶障,并且參數(shù) requeue = false 時(shí)

2.消息TTL(存活時(shí)間)過(guò)期

3.隊(duì)列達(dá)到最大長(zhǎng)度

rabbitMQ對(duì)于死信消息的處理是:如果配置了死信隊(duì)列蝗砾,成為死信的消息會(huì)被丟進(jìn)死信隊(duì)列,如果沒(méi)有則被丟棄溺忧。

2.配置死信隊(duì)列

死信隊(duì)列不是特殊的隊(duì)列憋飞,它只是綁定在了死信交換機(jī)上而已搭幻,并且死信交換機(jī)也不是特殊的交換機(jī),它也只是用來(lái)接收死信消息的

一般分為以下步驟:

1.配置業(yè)務(wù)隊(duì)列,綁定到業(yè)務(wù)交換機(jī)上

2.為業(yè)務(wù)隊(duì)列配置死信交換機(jī)和路由

3.配置死信隊(duì)列券勺,綁定到死信交換機(jī)上

模擬其中一種條件來(lái)進(jìn)行實(shí)戰(zhàn)绪钥!

配置類(lèi):

@Configuration
public class RabbitMQConfig {
    /**
     * 業(yè)務(wù)交換機(jī)
     */
    public static final String BUSINESS_EXCHANGE_NAME = "business.exchange";
    /**
     * 業(yè)務(wù)隊(duì)列
     */
    public static final String BUSINESS_QUEUE_NAME = "business.queue";
    /**
     * 死信交換機(jī)
     */
    public static final String DEAD_EXCHANGE_NAME = "dead.exchange";
    /**
     * 死信隊(duì)列
     */
    public static final String DEAD_QUEUE_NAME = "dead.queue";

    public static final String DEAD_ROUTING_KEY = "dead.routing.key";

    /**
     * 聲明業(yè)務(wù)交換機(jī)
    **/
    @Bean("businessExchange")
    public FanoutExchange businessExchange(){
        return new FanoutExchange(BUSINESS_EXCHANGE_NAME);
    }

    /**
     * 聲明業(yè)務(wù)隊(duì)列
     *
    **/
    @Bean("businessQueue")
    public Queue businessQueue(){
        Map<String, Object> args = new HashMap<>(2);
        //聲明綁定的死信交換機(jī)
        args.put("x-dead-letter-exchange", DEAD_EXCHANGE_NAME);
        //聲明死信路由key
        args.put("x-dead-letter-routing-key", DEAD_ROUTING_KEY);
        return QueueBuilder.durable(BUSINESS_QUEUE_NAME).withArguments(args).build();
    }

    /**
     * 業(yè)務(wù)隊(duì)列綁定到業(yè)務(wù)交換機(jī)
     *
    **/
    @Bean
    public Binding businessBind(@Qualifier("businessQueue")Queue businessQueue,
                                @Qualifier("businessExchange")FanoutExchange businessExchange){
        return BindingBuilder.bind(businessQueue).to(businessExchange);
    }

    /**
     * 聲明死信交換機(jī)
     **/
    @Bean("deadExchange")
    public DirectExchange deadExchange(){
        return new DirectExchange(DEAD_EXCHANGE_NAME);
    }

    /**
     * 聲明死信隊(duì)列
     *
     **/
    @Bean("deadQueue")
    public Queue deadQueue(){
        return new Queue(DEAD_QUEUE_NAME);
    }

    /**
     * 死信隊(duì)列綁定到死信交換機(jī)
     *
     **/
    @Bean
    public Binding deadBind(@Qualifier("deadQueue")Queue deadQueue,
                                @Qualifier("deadExchange")DirectExchange deadExchange){
        return BindingBuilder.bind(deadQueue).to(deadExchange).with(DEAD_ROUTING_KEY);
    }
}
exchange

businessExchange

deadExchange

業(yè)務(wù)隊(duì)列監(jiān)聽(tīng)

@Component
public class BusinessListener {
    Logger logger = LoggerFactory.getLogger(getClass());

    @RabbitListener(queues = RabbitMQConfig.BUSINESS_QUEUE_NAME)
    public void receive(Message message, Channel channel) throws Exception{
        String msg = new String(message.getBody());
        logger.info("收到消息:" + msg);
        if (msg.contains("dead")){
            channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
        }else {
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
        }
    }
}

死信隊(duì)列監(jiān)聽(tīng)

@Component
public class DeadListener {
    Logger logger = LoggerFactory.getLogger(getClass());

    @RabbitListener(queues = RabbitMQConfig.DEAD_QUEUE_NAME)
    public void receive(Message message, Channel channel) throws Exception{
        String msg = new String(message.getBody());
        logger.info("收到消息:" + msg);
    }
}

寫(xiě)一個(gè)controller來(lái)生產(chǎn)消息,方便測(cè)試

@RestController
@RequestMapping("my")
public class MyController {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @PostMapping("send")
    public void send(@RequestParam("msg")String msg){
        rabbitTemplate.convertSendAndReceive(RabbitMQConfig.BUSINESS_EXCHANGE_NAME,"", msg);
    }
}

發(fā)送一個(gè)消息


發(fā)送消息“msg”

結(jié)果


結(jié)果

發(fā)送一個(gè)死信消息
發(fā)送消息“deadmsg”

結(jié)果


結(jié)果
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末关炼,一起剝皮案震驚了整個(gè)濱河市程腹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌儒拂,老刑警劉巖寸潦,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異社痛,居然都是意外死亡见转,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)蒜哀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)斩箫,“玉大人,你說(shuō)我怎么就攤上這事撵儿〕丝停” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵统倒,是天一觀(guān)的道長(zhǎng)寨典。 經(jīng)常有香客問(wèn)我,道長(zhǎng)房匆,這世上最難降的妖魔是什么耸成? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮浴鸿,結(jié)果婚禮上井氢,老公的妹妹穿的比我還像新娘。我一直安慰自己岳链,他們只是感情好花竞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著掸哑,像睡著了一般约急。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上苗分,一...
    開(kāi)封第一講書(shū)人閱讀 51,245評(píng)論 1 299
  • 那天厌蔽,我揣著相機(jī)與錄音,去河邊找鬼摔癣。 笑死奴饮,一個(gè)胖子當(dāng)著我的面吹牛纬向,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播戴卜,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼逾条,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了投剥?” 一聲冷哼從身側(cè)響起师脂,我...
    開(kāi)封第一講書(shū)人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎薇缅,沒(méi)想到半個(gè)月后危彩,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泳桦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年汤徽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灸撰。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谒府,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出浮毯,到底是詐尸還是另有隱情完疫,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布债蓝,位于F島的核電站壳鹤,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏饰迹。R本人自食惡果不足惜芳誓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望啊鸭。 院中可真熱鬧锹淌,春花似錦、人聲如沸赠制。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)钟些。三九已至烟号,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間政恍,已是汗流浹背汪拥。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抚垃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像鹤树,于是被迫代替她去往敵國(guó)和親铣焊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354