1. 程式人生 > >10分鐘輕鬆搞定SpringBoot整合RabbitMQ教程

10分鐘輕鬆搞定SpringBoot整合RabbitMQ教程

第一步:在專案pom.xml檔案中,新增pring-boot-starter-amqp 依賴

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-amqp</artifactId>
   <version>1.5.9.RELEASE</version>
</dependency>

第二步:在專案application.properties檔案中,新增rabbitmq相關配置

##########RabbitMq配置##########
#是訪問port不是15672,15672是api和管理介面的port  
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=test
spring.rabbitmq.password=test
#如果要進行訊息回撥,則這裡必須要設定為true  
spring.rabbitmq.publisherconfirms=true
spring.rabbitmq.virtual-host=/
#最小訊息監聽執行緒數
spring.rabbitmq.listener.concurrency=2
#最大訊息監聽執行緒數
spring.rabbitmq.listener.max-concurrency=2

第三步:新增rabbitmq配置類和生產者類(生產訊息)、消費者類(消費訊息)

rabbitmq配置類

package com.fhsn.weixin.config.rabbitmq;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMqConfig {
    
    //宣告佇列
    @Bean
    public Queue queue1() {
        return new Queue("hello.queue1", true); // true表示持久化該佇列
    }
    
    @Bean
    public Queue queue2() {
        return new Queue("hello.queue2", true);
    }
    
    //宣告互動器
    @Bean
    TopicExchange topicExchange() {
        return new TopicExchange("topicExchange");
    }

    //繫結
    @Bean
    public Binding binding1() {
        return BindingBuilder.bind(queue1()).to(topicExchange()).with("key.1");
    }
    
    @Bean
    public Binding binding2() {
        return BindingBuilder.bind(queue2()).to(topicExchange()).with("key.#");
    }
    
}

生產者類(生產訊息)

package com.fhsn.weixin.config.rabbitmq;

import java.util.UUID;

import javax.annotation.PostConstruct;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.core.RabbitTemplate.ReturnCallback;
import org.springframework.amqp.rabbit.support.CorrelationData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class Sender implements RabbitTemplate.ConfirmCallback, ReturnCallback {
    
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    @PostConstruct
    public void init() {
        rabbitTemplate.setConfirmCallback(this);
        rabbitTemplate.setReturnCallback(this);
    }

    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        if (ack) {  
            System.out.println("訊息傳送成功:" + correlationData);  
        } else {  
            System.out.println("訊息傳送失敗:" + cause);  
        }  
        
    }

    @Override
    public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
        System.out.println(message.getMessageProperties().getCorrelationIdString() + " 傳送失敗");
        
    }

    //傳送訊息,不需要實現任何介面,供外部呼叫。
    public void send(String msg){
        
        CorrelationData correlationId = new CorrelationData(UUID.randomUUID().toString());
        
        System.out.println("開始傳送訊息 : " + msg.toLowerCase());
        String response = rabbitTemplate.convertSendAndReceive("topicExchange", "key.1", msg, correlationId).toString();
        System.out.println("結束髮送訊息 : " + msg.toLowerCase());
        System.out.println("消費者響應 : " + response + " 訊息處理完成");
    }
}


消費者類(消費訊息)

package com.fhsn.weixin.config.rabbitmq;

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
public class Receiver {
    
    @RabbitListener(queues = "hello.queue1")
    public String processMessage1(String msg) {
        System.out.println(Thread.currentThread().getName() + " 接收到來自hello.queue1佇列的訊息:" + msg);
        return msg.toUpperCase();
    }
    
    @RabbitListener(queues = "hello.queue2")
    public void processMessage2(String msg) {
        System.out.println(Thread.currentThread().getName() + " 接收到來自hello.queue2佇列的訊息:" + msg);
    }
}

第四步:

在專案pom.xml檔案中新增 spring-boot-starter-test依賴

  <dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-test</artifactId>
        <version>1.5.9.RELEASE</version>
        <scope>test</scope>
 </dependency>



第五步:新增測試類

package com.fhsn.weixn.controller.rabbitmq;

import java.util.Date;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.fhsn.WeixinWebApplication;
import com.fhsn.weixin.config.rabbitmq.Sender;


@RunWith(value=SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = WeixinWebApplication.class)
public class RabbitMqTests {
    
    @Autowired
    private Sender sender;
    
    @Test
    public void sendTest() throws Exception {
        while(true){
            String msg = new Date().toString();
            sender.send(msg);
            Thread.sleep(1000);
        }
    }
}



第六步 : 右擊選中     RabbitMqTests->Run As->Junit Test 執行測試類,檢視console控制檯輸出結果如下,即表示springboot成功整合rabbitmq

開始傳送訊息 : wed may 16 14:43:40 cst 2018
SimpleAsyncTaskExecutor-1 接收到來自hello.queue1佇列的訊息:Wed May 16 14:43:40 CST 2018
SimpleAsyncTaskExecutor-1 接收到來自hello.queue2佇列的訊息:Wed May 16 14:43:40 CST 2018
結束髮送訊息 : wed may 16 14:43:40 cst 2018
消費者響應 : WED MAY 16 14:43:40 CST 2018 訊息處理完成
開始傳送訊息 : wed may 16 14:43:42 cst 2018
SimpleAsyncTaskExecutor-2 接收到來自hello.queue1佇列的訊息:Wed May 16 14:43:42 CST 2018
SimpleAsyncTaskExecutor-2 接收到來自hello.queue2佇列的訊息:Wed May 16 14:43:42 CST 2018
結束髮送訊息 : wed may 16 14:43:42 cst 2018
消費者響應 : WED MAY 16 14:43:42 CST 2018 訊息處理完成
開始傳送訊息 : wed may 16 14:43:43 cst 2018
SimpleAsyncTaskExecutor-1 接收到來自hello.queue1佇列的訊息:Wed May 16 14:43:43 CST 2018
SimpleAsyncTaskExecutor-1 接收到來自hello.queue2佇列的訊息:Wed May 16 14:43:43 CST 2018
結束髮送訊息 : wed may 16 14:43:43 cst 2018
消費者響應 : WED MAY 16 14:43:43 CST 2018 訊息處理完成
開始傳送訊息 : wed may 16 14:43:44 cst 2018
SimpleAsyncTaskExecutor-2 接收到來自hello.queue2佇列的訊息:Wed May 16 14:43:44 CST 2018
SimpleAsyncTaskExecutor-2 接收到來自hello.queue1佇列的訊息:Wed May 16 14:43:44 CST 2018
結束髮送訊息 : wed may 16 14:43:44 cst 2018
消費者響應 : WED MAY 16 14:43:44 CST 2018 訊息處理完成


參考文章來源:

相關推薦

10分鐘輕鬆SpringBoot整合RabbitMQ教程

第一步:在專案pom.xml檔案中,新增pring-boot-starter-amqp 依賴<dependency> <groupId>org.springframework.boot</groupId> <artifac

10分鐘輕鬆SpringBoot整合Activiti6教程

第一步在專案pom.xml檔案中新增所需依賴<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http:/

VMware中CentOS 7網路配置(十分鐘輕鬆!)

VMware中CentOS 7網路配置(十分鐘輕鬆搞定!) 配置環境說明: 主機系統為win10、虛擬機器為VMware Workstation 14Pro中文版、虛擬機器中的linux系統為CentOS 7 64位。 1、 設定虛擬機器的網路連線方式: 2. 配置虛擬機器的NAT模式

redis之20分鐘輕鬆springCache快取(單機+叢集)

redis之20分鐘輕鬆搞定springCache快取(單機+叢集) 原文地址:https://m.baidu.com/from=1013843a/bd_page_type=1/ssid=0/uid=0/pu=sz%401321_1002%2Cta%40utouch_2_7.0_2_7.3%2Cu

關於ROS安裝快而簡潔的辦法~適合初學者或無開發經驗者“10分鐘”即可

準備工作 所謂“裸機”安裝,是指在PC機中安裝全新的作業系統,可以在PC機中作為獨立的作業系統存在,也可以與Windows等作業系統組成雙系統/多系統。 Ubuntu for ROS 發行版下載後是iso檔案,可以按照安裝Ubuntu的方式進行安裝,例如製作成Live CD在沒有作業系統的計算機上安裝

產品需求文件五分鐘輕鬆!這可能史上最全PRD文件模板

為什麼寫這篇文章? 第一:寫PMCAFF的PRD文件,大家都是使用者,比較好參考與理解,方便大家來找我寫的不好的地方。 第二:我在自學PRD文件的編寫過程中,總是遇到PRD文件裡的對應產品總是找不到或是下架的情況,很難找到比較全面以及詳細的參考模板,故一氣之下擼了一篇

Springboot(10)輕鬆統一異常處理

原始碼地址 異常的捕獲方式 方式一 HandlerExceptionResolver介面 實現該介面,註冊到spring容器中,當controller中產生異常的時候會呼叫該介面來處理,注意,當返回值指定檢視時會自動跳轉至指定的檢視中去,如果返回null

分鐘SpringBoot 和Redis 實戰整合

這裡,對於springboot和redis 不做介紹,大家可以自己去查詢資料~~~~~~~~~~~ windows下本地安裝 redis 安裝 話不多說,來就是開搞! 專案框架 具體實現程式碼 pom檔案 <?xml version="1.0" en

SpringBoot 輕鬆資料驗證 (一)

對於任何一個應用而言,客戶端做的資料有效性驗證都不是安全有效的,而資料驗證又是一個企業級專案架構上最為基礎的功能模組,這時候就要求我們在服務端接收到資料的時候也對資料的有效性進行驗證。為什麼這麼說呢?往往我們在編寫程式的時候都會感覺後臺的驗證無關緊要,畢竟客戶端已經做過驗證了

Springboot(9)輕鬆跨域訪問(CORS)

原始碼地址 CORS實現跨域訪問 方式1:返回新的CorsFilter 方式2:重寫WebMvcConfigurer 方式3:使用註解(@CrossOrigin) 方式4:手工設定響應頭(HttpServletResponse )

輕鬆RabbitMQ(七)——遠端過程呼叫RPC

翻譯:http://www.rabbitmq.com/tutorials/tutorial-six-java.html在第二篇博文中,我們已經瞭解到瞭如何使用工作佇列來向多個消費者分散耗時任務。但是付過我們需要在遠端電腦上執行一個方法然後等待結果,該怎麼辦?這是不同的需求。

一起來學SpringBoot | 第二十三篇:輕鬆重複提交(分散式鎖)

SpringBoot 是為了簡化 Spring 應用的建立、執行、除錯、部署等一系列問題而誕生的產物,自動裝配的特性讓我們可以更好的關注業務本身而不是外部的XML配置,我們只需遵循規範,引入相關的依賴就可以輕易的搭建出一個 WEB 工程 在 一起來學S

輕鬆RabbitMQ(二)——工作佇列之訊息分發機制

       上一篇博文中簡單介紹了一下RabbitMQ的基礎知識,並寫了一個經典語言入門程式——HelloWorld。本篇博文中我們將會建立一個工作佇列用來在工作者(consumer)間分發耗時任務。同樣是翻譯的官網例項。 工作佇列        在前一篇博文中,我們完

一起來學SpringBoot | 第二十六篇:輕鬆安全框架(Shiro)

SpringBoot 是為了簡化 Spring 應用的建立、執行、除錯、部署等一系列問題而誕生的產物,自動裝配的特性讓我們可以更好的關注業務本身而不是外部的XML配置,我們只需遵循規範,引入相關的依賴就可以輕易的搭建出一個 WEB 工程 Shiro 是

一起來學SpringBoot | 第十九篇:輕鬆資料驗證(一)

SpringBoot是為了簡化Spring應用的建立、執行、除錯、部署等一系列問題而誕生的產物,自動裝配的特性讓我們可以更好的關注業務本身而不是外部的XML配置,我們只需遵循規範,引入相關的依賴就可以輕易的搭建出一個 WEB 工程 對於任何一個

springboot mybatis plus多資料來源輕鬆 (上)

在開發中經常會遇到一個程式需要呼叫多個數據庫的情況,總得來說分為下面的幾種情況: 1. 一個程式會呼叫不同結構的兩個資料庫。 2. 讀寫分離,兩個資料結構可能一樣高,但是不同的操作針對不同的資料庫。 3. 混合情況,既有不同的結構的資料庫,也可能存在讀寫分離的情況。 下面針對第一種情況,提供一個解決方案。

SpringBoot系列5】SpringBoot整合RabbitMQ

urn 項目 div fin 交換 ng- eat convert sta 前言: 因為項目需要用到RabbitMQ,前幾天就看了看RabbitMQ的知識,記錄下SpringBoot整合RabbitMQ的過程。 給出兩個網址: RabbitMQ官方教程:http://

SpringBoot整合RabbitMq

tostring 易用性 toc 分布 code prior temp 模式匹配 推薦 1,該筆記主要是記錄自己學習Springboot整合RabbitMq過程,推薦一篇學習RabbitMq非常好的博客:http://blog.720ui.com/2017/rabbitmq

SpringBoot整合RabbitMQ之發送接收消息實戰

container 會同 prope spring 註解 流行 pin public lin 實戰前言 前幾篇文章中,我們介紹了SpringBoot整合RabbitMQ的配置以及實戰了Spring的事件驅動模型,這兩篇文章對於我們後續實戰RabbitMQ其他知識要點將起到奠

SpringBoot整合RabbitMQ之典型應用場景實戰二

factor aid 分享圖片 actor esp rem 排隊 stc tps 實戰前言RabbitMQ 作為目前應用相當廣泛的消息中間件,在企業級應用、微服務應用中充當著重要的角色。特別是在一些典型的應用場景以及業務模塊中具有重要的作用,比如業務服務模塊解耦、異步通信、