rabbitMQ第五篇:Spring集成RabbitMQ

来源:http://www.cnblogs.com/LipeiNet/archive/2016/11/18/6079427.html
-Advertisement-
Play Games

前面幾篇講解瞭如何使用rabbitMq,這一篇主要講解spring集成rabbitmq。 首先引入配置文件org.springframework.amqp,如下 一:配置消費者和生成者公共部分 二:配置生成者 三:生產者程式 其中convertAndSend方法預設第一個參數是交換機名稱,第二個參數 ...


   前面幾篇講解瞭如何使用rabbitMq,這一篇主要講解spring集成rabbitmq。

   首先引入配置文件org.springframework.amqp,如下

        <dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit</artifactId>
            <version>1.6.0.RELEASE</version>
        </dependency>

一:配置消費者和生成者公共部分

<rabbit:connection-factory id="connectionFactory" host="${rabbit.hosts}"
                               port="${rabbit.port}" username="${rabbit.username}" password="${rabbit.password}" virtual-host="${rabbit.virtualHost}"
                               channel-cache-size="50"/>
    <rabbit:admin connection-factory="connectionFactory"/>
    <!--定義消息隊列-->
    <rabbit:queue name="spittle.alert.queue.1" durable="true" auto-delete="false"/>
    <rabbit:queue name="spittle.alert.queue.2" durable="true" auto-delete="false"/>
    <rabbit:queue name="spittle.alert.queue.3" durable="true" auto-delete="false"/>
    <!--綁定隊列-->
    <rabbit:fanout-exchange id="spittle.fanout" name="spittle.fanout" durable="true">
        <rabbit:bindings>
            <rabbit:binding queue="spittle.alert.queue.1"></rabbit:binding>
            <rabbit:binding queue="spittle.alert.queue.2"></rabbit:binding>
            <rabbit:binding queue="spittle.alert.queue.3"></rabbit:binding>
        </rabbit:bindings>
    </rabbit:fanout-exchange>

二:配置生成者

<import resource="amqp-share.xml"/>
    <!--創建消息隊列模板-->
    <rabbit:template id="rabbitTemplate" connection-factory="connectionFactory"
                     exchange="spittle.fanout" message-converter="jsonMessageConverter">
    </rabbit:template>
    <bean id="jsonMessageConverter" class="org.springframework.amqp.support.converter.JsonMessageConverter"></bean>

三:生產者程式

public class Spittle implements Serializable {
    private Long id;
    private Spitter spitter;
    private String message;
    private Date postedTime;

    public Spittle(Long id, Spitter spitter, String message, Date postedTime) {
        this.id = id;
        this.spitter = spitter;
        this.message = message;
        this.postedTime = postedTime;
    }

    public Long getId() {
        return this.id;
    }

    public String getMessage() {
        return this.message;
    }

    public Date getPostedTime() {
        return this.postedTime;
    }

    public Spitter getSpitter() {
        return this.spitter;
    }
}
public class ProducerMain {
    public static void main(String[] args) throws Exception {
        ApplicationContext context = new ClassPathXmlApplicationContext("amqp/amqp-producer.xml");
        AmqpTemplate template = (AmqpTemplate) context.getBean("rabbitTemplate");
        for (int i = 0; i < 20; i++) {
            System.out.println("Sending message #" + i);
            Spittle spittle = new Spittle((long) i, null, "Hello world (" + i + ")", new Date());
            template.convertAndSend(spittle);
            Thread.sleep(5000);
        }
        System.out.println("Done!");
    }
}

其中convertAndSend方法預設第一個參數是交換機名稱,第二個參數是路由名稱,第三個才是我們發送的數據,現在我們啟動程式,效果如下

第四個:消費者程式

首先編寫一個用於監聽生產者發送信息的代碼

/**
 * Created by Administrator on 2016/11/18.
 */
public class SpittleAlertHandler implements MessageListener {
    @Override
    public void onMessage(Message message) {
        try {
            String body=new String(message.getBody(),"UTF-8");
            System.out.println(body);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}

一定要註意實現MessageListener,我們只需要獲取message的body即可,通過json來轉換我們需要的程式(比如我們可以發送一個map,map存放方法和實體,這樣我們可以通過反射來調用不同的程式來運行)。

下麵我們配置消費者

 

<import resource="amqp-share.xml"/>
    <rabbit:listener-container connection-factory="connectionFactory">
      <rabbit:listener ref="spittleListener" method="onMessage" queues="spittle.alert.queue.1,spittle.alert.queue.3,spittle.alert.queue.2"/>
    </rabbit:listener-container>
    <bean id="spittleListener" class="com.lp.summary.rabbitmq.impl.SpittleAlertHandler"/>

其中spittleListener是監聽的程式,method是執行的方法,queues是我們監聽的隊列,多個隊列可以逗號隔開(因為我們採用的是分發,所以三個隊列獲取的消息是相同的,這裡為了簡便我放在一個監聽程式中了,其實我們可以寫三個消費者,每個消費者監聽一個隊列)

現在只需要啟動程式即可運行

public class ConsumerMain {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("amqp/amqp-consumer.xml");
    }
}

 當然direct跟上面的情況差不多,只不過這個是根據路由匹配,先把數據發送到交換機,然後綁定路由和隊列,通過交換機id和路由來找到隊列,下麵是一些主要的配置

 <rabbit:queue id="spring-test-queue1" durable="true" auto-delete="false" exclusive="false" name="spring-test-queue1"></rabbit:queue>
    <rabbit:queue name="spring-test-queue2" durable="true" auto-delete="false" exclusive="false"></rabbit:queue>
    <!--交換機定義-->
    <!--rabbit:direct-exchange:定義exchange模式為direct,
        意思就是消息與一個特定的路由鍵完全匹配,才會轉發。
        rabbit:binding:設置消息queue匹配的key-->
    <rabbit:direct-exchange name="${rabbit.exchange.direct}" durable="true" auto-delete="false" id="${rabbit.exchange.direct}">
        <rabbit:bindings>
            <rabbit:binding queue="spring-test-queue1" key="spring.test.queueKey1"/>
            <rabbit:binding queue="spring-test-queue2" key="spring.test.queueKey2"/>
      </rabbit:bindings>
    </rabbit:direct-exchange>

    <!--spring template聲明-->
    <rabbit:template exchange="${rabbit.exchange.direct}" id="rabbitTemplate" connection-factory="connectionFactory"
    message-converter="jsonMessageConverter"></rabbit:template>
    <!--消息對象轉成成json-->
    <bean id="jsonMessageConverter" class="org.springframework.amqp.support.converter.JsonMessageConverter"></bean>

下麵是消費者監聽配置

 <rabbit:listener-container connection-factory="connectionFactory" acknowledge="auto">
        <rabbit:listener queues="spring-test-queue1" method="onMessage" ref="queueListenter"></rabbit:listener>
    </rabbit:listener-container>
    <rabbit:listener-container connection-factory="connectionFactory" acknowledge="auto">
        <rabbit:listener queues="spring-test-queue2" method="onMessage" ref="queueListenter"></rabbit:listener>
    </rabbit:listener-container>

下麵是程式

 public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext-rabbitmq-producer.xml");
        MQProducer mqProducer=(MQProducer) context.getBean("mqProducer");
        mqProducer.sendDateToQueue("spring.test.queueKey1","Hello World spring.test.queueKey1");
        mqProducer.sendDateToQueue("spring.test.queueKey2","Hello World spring.test.queueKey2");
    }

實際情況可能需要我們去分離消費者和生成者的程式。當然spring還有負載均衡的配置,這裡就不多介紹了。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • RSA: 獲取RSA實例: 獲取公鑰: 獲取私鑰: ...
  • Json.NET: 獲取類實例對應的jtoken:JObject.FromObject() 獲取數組實例對應的jtoken:JArray.FromObject() ...
  • Nhibernate 4.0 教程 目錄 1. 下載Nhibernate 4.04. 1 2. 入門教程... 2 3. 測試項目詳解... 3 4. 總結... 7 附:關聯知識點... 7 知識點1:C#靜態構造函數... 7 知識點2:關於Visual Studio文件生成操作... 8 前言 ...
  • 繼承的特點:繼承父類的屬性和方法。單繼承(多層繼承)c++里的繼承是多繼承 特性 :方法的覆寫(重寫) java中的繼承和OC中一樣。 比如:人可以養狗; 人 >狗 :整體和部分(擁有)關係。 球隊 >球員 :整體和部分的關係。 代碼中是最常見 has a 的關係 人 >學生 :學生是人 : 說明有 ...
  • php的socket編程算是比較難以理解的東西吧,不過,我們只要理解socket幾個函數之間的關係,以及它們所扮演的角色,那麼理解起來應該不是很難了,在筆者看來,socket編程,其實就是建立一個網路服務的客戶端和服務端,這和mysql的客戶端和服務端是一樣的,你只要理解mysql的客戶端和服務端是 ...
  • 最近在開發一個jsp學生信息管理系統,由於剛剛接觸jsp,遇到問題比較多,特此記錄與大家分享。 Jquery ajax提交表單到servlet示例 前臺部分代碼: ajax提交表單代碼: web.xml配置代碼: addStudents.java代碼(採用POST提交方式): ajax提交表單 通過 ...
  • 從根本上講,Python是一種面向對象的語言。它的類模塊支持多態,操作符重載和多重繼承等高級概念,並且以Python特有的簡潔的語法和類型,OOP十分易於使用。Python的語法簡單,容易上手。 Python程式可以分解成模塊、語句、表達式以及對象。1.程式由模塊構成。2.模塊包含語句。3.語句包含 ...
  • 2.1上傳 2.2解壓jdk #創建文件夾 mkdir /usr/java #解壓 tar -zxvf jdk-7u55-linux-i586.tar.gz -C /usr/java/ 2.3將java添加到環境變數中 vim /etc/profile #在文件最後添加 export JAVA_HO ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...