RabbitMQ筆記十四:ReturnListener

ReturnListener

mandatory

This flag tells the server how to react if the message cannot be routed to a queue.if this flag is set,the server will return an unroutable message with a return method.if this flag is zero,the server silently drops the message
如果mandatory有設(shè)置,則當(dāng)消息不能路由到隊(duì)列中去的時(shí)候枉氮,會(huì)觸發(fā)return method志衍。如果mandatory沒(méi)有設(shè)置,則當(dāng)消息不能路由到隊(duì)列的時(shí)候聊替,server會(huì)刪除該消息楼肪。

immediate

This flag tell the server how to react if the message cannot be routed to a queue consumer immediately.if the flag is set ,the server will return an undeliverable message with a return method.if this flag is zero,the server will queue the message ,but with no guarantee that it will ever be consumed.
如果有設(shè)置immediate,則當(dāng)消息路由到隊(duì)列的時(shí)候惹悄,沒(méi)有消費(fèi)者的時(shí)候春叫,會(huì)觸發(fā)return method。如果immediate標(biāo)識(shí)是0俘侠,則服務(wù)器就會(huì)將消息加入隊(duì)列象缀,但是不能保證這個(gè)消息能被消費(fèi)。

注意
immediate屬性在Rabbitmq3.x的時(shí)候爷速,被廢棄了央星。
因?yàn)檫@個(gè)關(guān)鍵字違背了生產(chǎn)者和消費(fèi)者之間解耦的特性,因?yàn)樯a(chǎn)者不關(guān)心消息是否被消費(fèi)者消費(fèi)掉惫东,所以這個(gè)字段被drop掉了莉给。

RabbitMQ java client 相關(guān)API

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

public class Send {
    public static void main(String[] args) throws Exception{
        ConnectionFactory connectionFactory = new ConnectionFactory();
        //或者
        connectionFactory.setUri("amqp://zhihao.miao:123456@192.168.1.131:5672");

        Connection connection = connectionFactory.newConnection();

        Channel channel = connection.createChannel();

        channel.addReturnListener(new ReturnListener() {
            @Override
            public void handleReturn(int replyCode,
                                     String replyText,
                                     String exchange,
                                     String routingKey,
                                     AMQP.BasicProperties properties,
                                     byte[] body)
                    throws IOException {
                System.out.println("=========handleReturn===method============");
                System.out.println("replyText:"+replyText);
                System.out.println("exchange:"+exchange);
                System.out.println("routingKey:"+routingKey);
                System.out.println("message:"+new String(body));
            }
        });

        AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder().deliveryMode(2).
                contentEncoding("UTF-8").build();

        //第三個(gè)參數(shù)是設(shè)置的mandatory
        channel.basicPublish("zhihao.direct.exchange","log.aaa",true,properties,"注冊(cè)驗(yàn)證碼".getBytes());

        TimeUnit.SECONDS.sleep(10);

        channel.close();
        connection.close();
    }
}
zhihao.direct.exchange的路由信息

因?yàn)槁酚刹坏秸_的隊(duì)列所以觸發(fā)了ReturnListener方法的回調(diào),控制臺(tái)上打恿凇:

replyText:NO_ROUTE
exchange:zhihao.direct.exchange
routingKey:log.aaa
message:注冊(cè)驗(yàn)證碼

spring-amqp的相關(guān)api

配置:

import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MQConfig {

    @Bean
    public ConnectionFactory connectionFactory(){
        CachingConnectionFactory factory = new CachingConnectionFactory();
        factory.setUri("amqp://zhihao.miao:123456@192.168.1.131:5672");
        factory.setPublisherReturns(true);
        return factory;
    }

    @Bean
    public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory){
        RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
        return rabbitAdmin;
    }

    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory){
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setMandatory(true);
        //rabbitTemplate.setMandatoryExpression(new SpelExpressionParser().parseExpression("(1+2) > 3")); //表達(dá)式的值為false
        rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback(){
            @Override
            public void returnedMessage(Message message,
                                        int replyCode,
                                        String replyText,
                                        String exchange,
                                        String routingKey){
                System.out.println("============returnedMessage==method=========");
                System.out.println("replyCode: "+replyCode);
                System.out.println("replyText: "+replyText);
                System.out.println("exchange: "+exchange);
                System.out.println("routingKey: "+routingKey);
            }
        });
        return rabbitTemplate;
    }
}

發(fā)送消息

import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;

import java.util.concurrent.TimeUnit;

@ComponentScan
public class Application {

    public static void main(String[] args) throws Exception{
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Application.class);

        RabbitTemplate rabbitTemplate = context.getBean(RabbitTemplate.class);
        System.out.println(rabbitTemplate);

        MessageProperties messageProperties = new MessageProperties();
        messageProperties.getHeaders().put("desc","消息發(fā)送");
        messageProperties.getHeaders().put("token","234sdfsdf3r342dsfd1232");

        //路由不到指定的隊(duì)列
        rabbitTemplate.convertAndSend("zhihao.direct.exchange","log.aaa","hello welcome");

        TimeUnit.SECONDS.sleep(10);

        context.close();
    }
}
zhihao.direct.exchange的路由信息

rabbitTemplate.setReturnCallback的方法會(huì)被執(zhí)行颓遏,控制臺(tái)打印:

============returnedMessage==method=========
replyCode: 312
replyText: NO_ROUTE
exchange: zhihao.direct.exchange
routingKey: log.aaa

總結(jié)

  • 設(shè)置factory.setPublisherReturns(true);
  • rabbitTemplate.setMandatory(true);或rabbitTemplate.setMandatoryExpression(new SpelExpressionParser().parseExpression("(1+2) > 2")); //表達(dá)式的值為true
    才會(huì)觸發(fā)returnCallback回調(diào)方法的執(zhí)行滞时。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末叁幢,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子坪稽,更是在濱河造成了極大的恐慌曼玩,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窒百,死亡現(xiàn)場(chǎng)離奇詭異黍判,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)篙梢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門顷帖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事贬墩×裥幔” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵震糖,是天一觀的道長(zhǎng)录肯。 經(jīng)常有香客問(wèn)我趴腋,道長(zhǎng)吊说,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任优炬,我火速辦了婚禮颁井,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蠢护。我一直安慰自己雅宾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布葵硕。 她就那樣靜靜地躺著眉抬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪懈凹。 梳的紋絲不亂的頭發(fā)上蜀变,一...
    開(kāi)封第一講書(shū)人閱讀 51,165評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音介评,去河邊找鬼库北。 笑死,一個(gè)胖子當(dāng)著我的面吹牛们陆,可吹牛的內(nèi)容都是我干的寒瓦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼坪仇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼杂腰!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起椅文,我...
    開(kāi)封第一講書(shū)人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤喂很,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后雾袱,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體恤筛,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年芹橡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了毒坛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖煎殷,靈堂內(nèi)的尸體忽然破棺而出屯伞,到底是詐尸還是另有隱情,我是刑警寧澤豪直,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布劣摇,位于F島的核電站,受9級(jí)特大地震影響弓乙,放射性物質(zhì)發(fā)生泄漏末融。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一暇韧、第九天 我趴在偏房一處隱蔽的房頂上張望勾习。 院中可真熱鬧,春花似錦懈玻、人聲如沸巧婶。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)艺栈。三九已至,卻和暖如春湾盒,著一層夾襖步出監(jiān)牢的瞬間湿右,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工历涝, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诅需,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓荧库,卻偏偏與公主長(zhǎng)得像堰塌,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子分衫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理场刑,服務(wù)發(fā)現(xiàn),斷路器蚪战,智...
    卡卡羅2017閱讀 134,651評(píng)論 18 139
  • RabbitMQ官網(wǎng)中文版教程: http://rabbitmq.mr-ping.com/tutorials_wi...
    薛晨閱讀 1,344評(píng)論 0 1
  • =========================================================...
    lavor閱讀 3,488評(píng)論 0 5
  • # Shell命令 ? 硬件·內(nèi)核·監(jiān)測(cè) ? tput tput 命令可以靈活地設(shè)置終端的屬性和功能牵现,個(gè)性化定制終...
    mincase閱讀 530評(píng)論 0 0
  • 轉(zhuǎn)眼間從11月入職,12月簽合同至今邀桑,說(shuō)說(shuō)短短幾個(gè)月發(fā)生的事情吧瞎疼。
    伽羅瀾閱讀 139評(píng)論 0 0