RabbitMQ與Spring整合

最近一直在玩rebbitMQ袄简,終于抽時間可以寫一下關(guān)于RebbitMQ與Spring框架整合的東西了。

安裝消息隊列環(huán)境

因為是自己玩,環(huán)境安裝都是在Windows上進行的精耐,總體來說過程比較簡單希太,Linux上應(yīng)該也差不多克饶。

Windows上RabbitMQ的開發(fā)可以參考:http://www.reibang.com/p/4c65827edbd1

消息隊列安裝完后,就可以開始整合測試了誊辉。

安裝完畢之后可以按照以下說明進行配置矾湃,新建virtual-host,交換器和隊列堕澄,當(dāng)然這些都可以考代碼新建及操作邀跃。
https://blog.csdn.net/u013177381/article/details/74011645

引入依賴

      <dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit</artifactId>
            <version>1.6.5.RELEASE</version>
            <exclusions>
                <exclusion>
                    <artifactId>spring-context</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
            </exclusions>
        </dependency>

<!-- RabbitMQ -->
        <dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>3.5.1</version>
        </dependency>

消息通信使用的是amqp協(xié)議通信霉咨,這里的<exclusion>是為防止spring包引入沖突

這樣前期的準(zhǔn)備工作就做好了,接下來就開始整合spring

spring配置

  1. 首先是寫一個RabbitMQ屬性文件 rabbitMQ.properties :
rmq.ip=127.0.0.1
rmq.producer.num=20
rmq.port=5672
rmq.manager.user=guest
rmq.manager.password=guest

當(dāng)然這是最基本的屬性拍屑,可以在配置了MQ之后進行修改途戒,如新建用戶及密碼等,guest僅限于本機訪問僵驰。

  1. spring引入properties文件:
<bean id="propertyConfigurer" class="com.trace.app.framework.toolsmodel.ConvertPwdPropertyConfigurer">
        <property name="locations">
            <list>
                <value>classpath:rabbitMQ.properties</value>
            </list>
        </property>
        <property name="fileEncoding" value="utf-8"></property>
    </bean>
  1. 配置連接工廠
    以下給出兩種方式喷斋,都可行:(提前使用控制臺建立了virtual-host)
<rabbit:connection-factory id="connectionFactory" virtual-host="test" host="${rmq.ip}"
                               username="${rmq.manager.user}" password="${rmq.manager.password}" port="${rmq.port}"/>
<bean id="connectionFactory"  class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
        <!--<constructor-arg value="localhost" />-->
        <property name="username" value="${rmq.manager.user}" />
        <property name="password" value="${rmq.manager.password}" />
        <property name="host" value="${rmq.ip}" />
        <property name="port" value="${rmq.port}" />
        <property name="virtualHost" value="test"/>
    </bean>

第一種形式是使用Spring提供的<rabbit:xxx>標(biāo)簽,主要有如下4中轉(zhuǎn)發(fā)器類型標(biāo)簽
rabbit:fanout-exchange
rabbit:direct-exchange
rabbit:topic-exchange
rabbit:headers-exchange

接下來要聲明消息隊列管理員管理該連接工廠(同樣是兩種方法)

<!--<bean id="rabbitAdmin"  class="org.springframework.amqp.rabbit.core.RabbitAdmin">-->
        <!--<constructor-arg ref="connectionFactory" />-->
    <!--</bean>-->

    <rabbit:admin connection-factory="connectionFactory"/>

還需要聲明消息隊列中的交換器和隊列蒜茴,這里我是直接在控制臺建立了messageExchange交換器和messageQueue隊列

<!-- 聲明消息隊列星爪,消息系統(tǒng)監(jiān)聽隊列 -->
    <!-- messageQueue 是在(1)中創(chuàng)建的隊列 -->
    <rabbit:queue id="messageQueue" durable="true" auto-delete="false" exclusive="false" name="messageQueue"/>

    <!-- exchange queue binging key 綁定 -->
    <!--聲明交換 在(1)配置的交換-->
    <rabbit:topic-exchange name="messageExchange" durable="true" auto-delete="false" id="messageExchange" >
        <rabbit:bindings>
            <rabbit:binding pattern="message.*" queue="messageQueue"/>
        </rabbit:bindings>
    </rabbit:topic-exchange>

    <rabbit:template exchange="messageExchange" id="rabbitTemplate" connection-factory="connectionFactory"/>
  1. 聲明生產(chǎn)者和消費者
    聲明生產(chǎn)者和消費者,下面給出xml配置的聲明方式粉私,可以多個生產(chǎn)者和多個消費者移必。
<!--聲明生產(chǎn)者 -->
    <bean id="messageSender"
          class="com.trace.app.framework.services.MessageSender" name="MessageSender">
        <property name="amqpTemplate" ref="rabbitTemplate"/>
        <!-- <property name="routingKey" value="message.test" ></property> -->
    </bean>
    <!--聲明消費者 -->
    <bean id="messageConsumer" class="com.trace.app.framework.services.MessageConsumer" name="messageConsumer" />

還需要讓消費者監(jiān)聽隊列,做以下配置:

<rabbit:listener-container
            connection-factory="connectionFactory" acknowledge="auto">
        <!-- 讓消費者監(jiān)聽這個隊列 -->
        <rabbit:listener ref="messageConsumer" queues="messageQueue" />
    </rabbit:listener-container>

當(dāng)然也可以使用注釋的方法聲明生產(chǎn)者和消費者對象毡鉴,這里就不贅述了崔泵。

  1. 測試
    自此spring的整合配置就完成了,再來貼出我的生產(chǎn)者和消費者的測試代碼

生產(chǎn)者

/**
 * rabbitMQ生產(chǎn)者
 * */
@Service
public class MessageSender {

    private AmqpTemplate amqpTemplate;
    private String routingKey;

    public AmqpTemplate getAmqpTemplate() {
        return amqpTemplate;
    }

    public void setAmqpTemplate(AmqpTemplate amqpTemplate) {
        this.amqpTemplate = amqpTemplate;
    }

    public String getRoutingKey() {
        return routingKey;
    }

    public void setRoutingKey(String routingKey) {
        this.routingKey = routingKey;
    }

    public void sendDataToQueue(Object obj) {
        System.out.println("routingKey = " + this.routingKey);
        System.out.println("Obj = " + obj);
        amqpTemplate.convertAndSend(this.routingKey, obj);
    }
}

消費者

/**
 * rabbitMQ消費者
 * */
public class MessageConsumer implements MessageListener {

    private Logger logger = LoggerFactory.getLogger(MessageConsumer.class);


    @Override
    public void onMessage(Message message) {
        logger.info("receive message:{}",message);
    }
    
}

自此spring整合RabbitMQ的過程就結(jié)束了猪瞬,在接下會介紹關(guān)于RabbitMQ生產(chǎn)者和消費者的具體事例憎瘸,作為備忘參考。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末陈瘦,一起剝皮案震驚了整個濱河市幌甘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌痊项,老刑警劉巖锅风,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鞍泉,居然都是意外死亡皱埠,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門咖驮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來边器,“玉大人,你說我怎么就攤上這事托修⊥桑” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵睦刃,是天一觀的道長砚嘴。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么际长? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任婆誓,我火速辦了婚禮,結(jié)果婚禮上也颤,老公的妹妹穿的比我還像新娘洋幻。我一直安慰自己,他們只是感情好翅娶,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布文留。 她就那樣靜靜地躺著,像睡著了一般竭沫。 火紅的嫁衣襯著肌膚如雪燥翅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天蜕提,我揣著相機與錄音森书,去河邊找鬼。 笑死谎势,一個胖子當(dāng)著我的面吹牛凛膏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播脏榆,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼猖毫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了须喂?” 一聲冷哼從身側(cè)響起吁断,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎坞生,沒想到半個月后仔役,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡是己,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年又兵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赃泡。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡寒波,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出升熊,到底是詐尸還是另有隱情,我是刑警寧澤绸栅,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布级野,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蓖柔。R本人自食惡果不足惜辰企,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望况鸣。 院中可真熱鬧牢贸,春花似錦、人聲如沸镐捧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽懂酱。三九已至竹习,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間列牺,已是汗流浹背整陌。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瞎领,地道東北人泌辫。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像九默,于是被迫代替她去往敵國和親甥郑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理荤西,服務(wù)發(fā)現(xiàn)澜搅,斷路器,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • http://liuxing.info/2017/06/30/Spring%20AMQP%E4%B8%AD%E6%...
    sherlock_6981閱讀 15,912評論 2 11
  • 前言 在微服務(wù)架構(gòu)的系統(tǒng)中邪锌,我們通常會使用輕量級的消息代理來構(gòu)建一個共用的消息主題讓系統(tǒng)中所有微服務(wù)實例都連接上來...
    Chandler_玨瑜閱讀 6,576評論 2 39
  • RabbitMQ的功能很強大勉躺,這一節(jié)只講最基礎(chǔ)的應(yīng)用,就是如何通過spring集成rabbitmq觅丰,把消息放入隊列...
    孔垂云閱讀 373評論 0 1
  • 文/陳雄輝 麻將桌上搖擺不定的騾子 五千里開外玩命的狼奔豕突 煙熏火燎的 何止是變味的人性 酒壇中纏綿難醒的妝容 ...
    情島漁夫閱讀 394評論 1 3