SpringBoot gradle 中使用RabbitMQ(三)

此文章參考:http://blog.csdn.net/zl18310999566/article/details/54341057

發(fā)送端服務(wù)器

配置文件信息

@Configuration
public class RabbitConfig {
  
   /*此處?kù)o態(tài)常量薄榛,在原作中為了保證名稱統(tǒng)一使用裂明,可以不聲明*/
    public static final String FOO_EXCHANGE = "callback.exchange.foo";
    public static final String FOO_EXCHANGE_TOPIC = "callback.topic.exchange.foo";
    public static final String FOO_ROUTINGKEY = "callback.routingkey.foo";
    public static final String FOO_QUEUE = "callback.queue.foo";
    /*end*/

   /*顯式使用配置文件信息*/
    @Value("${spring.rabbitmq.host}")
    private String host;
    @Value("${spring.rabbitmq.port}")
    private Integer port;
    @Value("${spring.rabbitmq.username}")
    private String username;
    @Value("${spring.rabbitmq.password}")
    private String password;
    @Value("${spring.rabbitmq.virtual-host}")
    private String virtualHost;
    @Value("${spring.rabbitmq.publisher-confirms}")
    private boolean publisherConfirms;
    /*end*/

    @Bean
    public ConnectionFactory connectionFactory() {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
        connectionFactory.setHost(host);
        connectionFactory.setPort(port);
        connectionFactory.setUsername(username);
        connectionFactory.setPassword(password);
        connectionFactory.setVirtualHost(virtualHost);
        /** 如果要進(jìn)行消息回調(diào)攻柠,則這里必須要設(shè)置為true */
        connectionFactory.setPublisherConfirms(publisherConfirms);
        return connectionFactory;
    }

    @Bean
    /** 因?yàn)橐O(shè)置回調(diào)類,所以應(yīng)是prototype類型杯聚,如果是singleton類型瘤运,則回調(diào)  類為最后一次設(shè)置 */  
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    /* 
     @Scope(value=ConfigurableBeanFactory.SCOPE_PROTOTYPE)這個(gè)是說在每次注入的時(shí)候回自動(dòng)創(chuàng)建一個(gè)新的bean實(shí)例
     @Scope(value=ConfigurableBeanFactory.SCOPE_SINGLETON)單例模式峰伙,在整個(gè)應(yīng)用中只能創(chuàng)建一個(gè)實(shí)例
     @Scope(value=WebApplicationContext.SCOPE_GLOBAL_SESSION)全局session中的一般不常用
     @Scope(value=WebApplicationContext.SCOPE_APPLICATION)在一個(gè)web應(yīng)用中只創(chuàng)建一個(gè)實(shí)例
     @Scope(value=WebApplicationContext.SCOPE_REQUEST)在一個(gè)請(qǐng)求中創(chuàng)建一個(gè)實(shí)例
     @Scope(value=WebApplicationContext.SCOPE_SESSION)每次創(chuàng)建一個(gè)會(huì)話中創(chuàng)建一個(gè)實(shí)例
     */
    public RabbitTemplate rabbitTemplate() {
        RabbitTemplate template = new RabbitTemplate(connectionFactory());  //如果上面未使用顯示調(diào)用聲明 ConnectionFactory,此處運(yùn)行會(huì)報(bào)錯(cuò):ConnectionFactory is null
        return template;
    }

消息發(fā)送

@Component
public class MessageSender implements RabbitTemplate.ConfirmCallback{

    private RabbitTemplate rabbitTemplate;

    @Autowired
    public MessageSender(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
        this.rabbitTemplate.setConfirmCallback(this);
    }

    public void send(String content) {
        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
        rabbitTemplate.convertAndSend(
                RabbitConfig.FOO_EXCHANGE_TOPIC,  //交換機(jī)
                RabbitConfig.FOO_ROUTINGKEY,//路由
                content,                    //內(nèi)容
                correlationData
        );
    }

    public void sendTopic(String content){
        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
        rabbitTemplate.convertAndSend(
                RabbitConfig.FOO_EXCHANGE_TOPIC,  //交換機(jī)
                RabbitConfig.FOO_ROUTINGKEY + ".topic",//路由
                content,                    //內(nèi)容
                correlationData
        );
    }

    /**
     * 回調(diào)方法
     */
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {

    }
}

接收端服務(wù)器

@Component
@Configuration
@RabbitListener(queues = RabbitMQFinal.FOO_QUEUE)
public class MessageReceiver {

    /**
     * 設(shè)置交換機(jī)
     *
     * @return
     */
    @Bean
    public DirectExchange directExchange() {
        /**
         * DirectExchange  : 按照routingkey分發(fā)到指定隊(duì)列
         * TopicExchange   : 多關(guān)鍵字匹配
         * FanoutExchange  : 將消息分發(fā)到所有的綁定隊(duì)列浸卦,無routingkey的概念
         * HeadersExchange : 通過添加屬性key-value匹配
         */
        return new DirectExchange(RabbitMQFinal.FOO_EXCHANGE);
    }

    @Bean
    public TopicExchange topicExchange(){
        return new TopicExchange(RabbitMQFinal.FOO_EXCHANGE_TOPIC);
    }

    /**
     * 注冊(cè)隊(duì)列
     *
     * @return
     */
    @Bean
    public Queue queue() {
        return new Queue(RabbitMQFinal.FOO_QUEUE);
    }

    /**
     * 將隊(duì)列綁定至交換機(jī)
     *
     * @return
     */
    @Bean
    public Binding binding() {
        //綁定隊(duì)列
        return BindingBuilder.bind(queue()) //綁定隊(duì)列
                .to(topicExchange())       //設(shè)置交換機(jī)
                .with(RabbitMQFinal.FOO_ROUTINGKEY + ".#");//設(shè)置 routingkey topic采用模糊匹配
    }

    @RabbitHandler
    public void process(@Payload String content) {
        System.out.println("Receiver Value : " + content);
    }

}

測(cè)試類

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = WebClientCoreApplication.class)
@WebAppConfiguration
public class RabbitTest {

    @Autowired
    MessageSender messageSender;

    @Test
    public void testRabbit(){
        String content = "hello " + new Date();
        System.out.println("Sender-message : " + content);
        messageSender.send(content);
    }
}
//WebClientCoreApplication 為當(dāng)前服務(wù)的啟動(dòng)類

測(cè)試過程

  • 啟動(dòng)接收服務(wù)器
  • 執(zhí)行測(cè)試類

期望值

  • 發(fā)送服務(wù)器正常打印
  • 接收服務(wù)器正常打印
  • RabbitMQ 管理端可以正常查閱發(fā)送記錄

如果接收端未配置可用消息隊(duì)列,接收端會(huì)循環(huán)檢測(cè)如失。

寫在后面(可忽略)

通過查看RabbitMQ 管理端頁(yè)面

隊(duì)列界面

交換機(jī)界面

消息通過 ROUTINGKEY 完成綁定
生產(chǎn)者者不需要再聲明隊(duì)列绊诲,只需在消息中綁定 ROUTINGKEY 即可。
交換機(jī)設(shè)置褪贵,隊(duì)列處理交由消息監(jiān)聽者處理掂之。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抗俄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子世舰,更是在濱河造成了極大的恐慌动雹,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跟压,死亡現(xiàn)場(chǎng)離奇詭異胰蝠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)震蒋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門茸塞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人查剖,你說我怎么就攤上這事钾虐。” “怎么了笋庄?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵效扫,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我直砂,道長(zhǎng)菌仁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任静暂,我火速辦了婚禮济丘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘籍嘹。我一直安慰自己,他們只是感情好弯院,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布辱士。 她就那樣靜靜地躺著,像睡著了一般听绳。 火紅的嫁衣襯著肌膚如雪颂碘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天椅挣,我揣著相機(jī)與錄音头岔,去河邊找鬼。 笑死鼠证,一個(gè)胖子當(dāng)著我的面吹牛峡竣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播量九,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼适掰,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼颂碧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起类浪,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤载城,失蹤者是張志新(化名)和其女友劉穎蹲缠,沒想到半個(gè)月后锭亏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡漱挎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年力细,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了睬澡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡艳汽,死狀恐怖猴贰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情河狐,我是刑警寧澤米绕,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站馋艺,受9級(jí)特大地震影響栅干,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捐祠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一碱鳞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧踱蛀,春花似錦窿给、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至猬膨,卻和暖如春角撞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背勃痴。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工谒所, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沛申。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓劣领,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親铁材。 傳聞我的和親對(duì)象是個(gè)殘疾皇子剖踊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理庶弃,服務(wù)發(fā)現(xiàn),斷路器德澈,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • 來源 RabbitMQ是用Erlang實(shí)現(xiàn)的一個(gè)高并發(fā)高可靠AMQP消息隊(duì)列服務(wù)器歇攻。支持消息的持久化、事務(wù)梆造、擁塞控...
    jiangmo閱讀 10,357評(píng)論 2 34
  • 關(guān)于消息隊(duì)列缴守,從前年開始斷斷續(xù)續(xù)看了些資料,想寫很久了镇辉,但一直沒騰出空屡穗,近來分別碰到幾個(gè)朋友聊這塊的技術(shù)選型,是時(shí)...
    預(yù)流閱讀 584,655評(píng)論 51 786
  • RabbitMQ筆記 本文參考資料:http://blog.csdn.net/chwshuang/article/...
    wangxiaoda閱讀 2,821評(píng)論 0 11
  • 青春的心 不知道該如何抉擇 那茫茫的未來 青春的利刃 被我藏在袖中 阻滯,那已廉價(jià)的呼...
    奎木天狼星閱讀 558評(píng)論 16 13