亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Spring boot集成RabbitMQ的示例代碼

2024-07-14 08:40:53
字體:
來源:轉載
供稿:網友

RabbitMQ簡介

RabbitMQ是一個在AMQP基礎上完整的,可復用的企業消息系統

MQ全稱為Message Queue, 消息隊列(MQ)是一種應用程序對應用程序的通信方法。應用程序通過讀寫出入隊列的消息(針對應用程序的數據)來通信,而無需專用連接來鏈接它們。消息傳遞指的是程序之間通過在消息中發送數據進行通信,而不是通過直接調用彼此來通信,直接調用通常是用于諸如遠程過程調用的技術。排隊指的是應用程序通過 隊列來通信。隊列的使用除去了接收和發送應用程序同時執行的要求。

AMQP就是一個協議,是一個高級抽象層消息通信協議。

雖然在同步消息通訊的世界里有很多公開標準(如 COBAR的 IIOP ,或者是 SOAP 等),但是在異步消息處理中卻不是這樣,只有大企業有一些商業實現(如微軟的 MSMQ ,IBM 的 Websphere MQ 等),因此,在 2006 年的 6 月,Cisco 、Redhat、iMatix 等聯合制定了 AMQP 的公開標準。也就是說AMQP是異步通訊的一個協議。

RabbitMQ使用場景

在項目中,將一些無需即時返回且耗時的操作提取出來,進行了異步處理,而這種異步處理的方式大大的節省了服務器的請求響應時間,從而提高了系統的吞吐量。不過大多數不僅僅是無需即時返回,甚至是執行是否成功都無所謂。如果需要即時返回則可以使用Dubbo,Spring boot與Dubbo集成可以去看Spring boot 集成Dubbox

RabbitMQ依賴

RabbitMQ并不是直接一個簡單的jar包(Jar包只是提供一個基本的與RabbitMQ本身通訊的一些功能),和Dubbo相同,RabbitMQ也需要其他軟件來運行,以下是RabbitMQ運行所需要的軟件

1、Erlang

由于RabbitMQ軟件本身是基于Erlang開發的,所以想要運行RabbitMQ必須要先按照Erlang

Erlang官網

Erlang下載地址

RabbitMQ

RabbitMQ才是實現消息隊列的核心

RabbitMQ官網

RabbitMQ下載

配置RabbitMQ

安裝完成后,需要完成一些配置才能使用RabbitMQ,可以直接用cmd到RabbitMQ的安裝目錄下的sbin目錄通過命令配置,也可以直接在開始菜單中直接找到RabbitMQ Command Prompt (sbin dir)運行直接到達RabbitMQ的安裝目錄的sbin,為了方便,我們先啟用管理插件,執行命令

rabbitmq-plugins.bat enable rabbitmq_management 

即可,注意,這是在Windows下面,如果是Linux則沒有bat后綴 然后我們添加一個用戶,因為在外網環境沒有用戶的情況下是不能連接成功的,執行添加用戶命令

rabbitmqctl.bat add_user springboot password 

springboot是用戶名,password是密碼

然后為了方便演示,我們給springboot賦予管理員權限,方便登錄管理頁面

rabbitmqctl.bat set_user_tags springboot administrator 

給賬號賦予虛擬主機權限

rabbitmqctl.bat set_permissions -p / springboot .* .* .* 

然后啟動RabbitMQ服務 訪問RabbitMQ管理頁面http://localhost:15672即可看見登錄頁面,如果沒有創建用戶則可以用guest,guest登錄,如果有創建用戶則用創建的用戶登錄

創建Springboot項目

因為創建spring boot項目在前面的文章已經說過很多次了,所以這里就不多說了

添加RabbitMQ相關依賴

    <!-- rabbitmq -->    <dependency>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starter-amqp</artifactId>    </dependency>

沒錯,就是點配置,不過這樣可能有點不理解,我還是把全部配置貼出來吧

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>wang.raye.rabbitmq</groupId> <artifactId>demo1</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>demo1</name> <url>http://maven.apache.org</url> <properties>  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties><parent>     <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-parent</artifactId>    <version>1.4.0.RELEASE</version>  </parent>  <dependencies>    <dependency>      <groupId>junit</groupId>      <artifactId>junit</artifactId>      <version>3.8.1</version>      <scope>test</scope>    </dependency>    <!-- Springboot -->    <dependency>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starter-web</artifactId>    </dependency>    <!-- rabbitmq -->    <dependency>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starter-amqp</artifactId>    </dependency>  </dependencies></project>

因為沒有做其他操作,所以目前項目主要是依賴2個模塊,一個Sprig boot,一個RabbitMQ

添加配置類

package wang.raye.rabbitmq.demo1;import org.springframework.amqp.core.AcknowledgeMode; import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.BindingBuilder; import org.springframework.amqp.core.DirectExchange; import org.springframework.amqp.core.Message; import org.springframework.amqp.core.Queue; import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.amqp.rabbit.core.ChannelAwareMessageListener; import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;/** * rabbitmq 的配置類 *  * @author Raye * @since 2016年10月12日10:57:44 */@Configuration public class RabbitMQConfig {   /** 消息交換機的名字*/  public static final String EXCHANGE = "my-mq-exchange";  /** 隊列key1*/  public static final String ROUTINGKEY1 = "queue_one_key1";  /** 隊列key2*/  public static final String ROUTINGKEY2 = "queue_one_key2";  /**   * 配置鏈接信息   * @return   */  @Bean  public ConnectionFactory connectionFactory() {    CachingConnectionFactory connectionFactory = new CachingConnectionFactory("127.0.0.1",5672);    connectionFactory.setUsername("springboot");    connectionFactory.setPassword("password");    connectionFactory.setVirtualHost("/");    connectionFactory.setPublisherConfirms(true); // 必須要設置    return connectionFactory;  }  /**    * 配置消息交換機   * 針對消費者配置     FanoutExchange: 將消息分發到所有的綁定隊列,無routingkey的概念     HeadersExchange :通過添加屬性key-value匹配     DirectExchange:按照routingkey分發到指定隊列     TopicExchange:多關鍵字匹配    */   @Bean   public DirectExchange defaultExchange() {     return new DirectExchange(EXCHANGE, true, false);  }   /**   * 配置消息隊列1   * 針對消費者配置    * @return   */  @Bean   public Queue queue() {     return new Queue("queue_one", true); //隊列持久   }  /**   * 將消息隊列1與交換機綁定   * 針對消費者配置    * @return   */  @Bean   public Binding binding() {     return BindingBuilder.bind(queue()).to(defaultExchange()).with(RabbitMQConfig.ROUTINGKEY1);   }   /**   * 配置消息隊列2   * 針對消費者配置    * @return   */  @Bean   public Queue queue1() {     return new Queue("queue_one1", true); //隊列持久   }  /**   * 將消息隊列2與交換機綁定   * 針對消費者配置    * @return   */  @Bean   public Binding binding1() {     return BindingBuilder.bind(queue1()).to(defaultExchange()).with(RabbitMQConfig.ROUTINGKEY2);   }   /**   * 接受消息的監聽,這個監聽會接受消息隊列1的消息   * 針對消費者配置    * @return   */  @Bean   public SimpleMessageListenerContainer messageContainer() {     SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory());     container.setQueues(queue());     container.setExposeListenerChannel(true);     container.setMaxConcurrentConsumers(1);     container.setConcurrentConsumers(1);     container.setAcknowledgeMode(AcknowledgeMode.MANUAL); //設置確認模式手工確認     container.setMessageListener(new ChannelAwareMessageListener() {      public void onMessage(Message message, com.rabbitmq.client.Channel channel) throws Exception {        byte[] body = message.getBody();         System.out.println("收到消息 : " + new String(body));         channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); //確認消息成功消費       }     });     return container;   }   /**   * 接受消息的監聽,這個監聽會接受消息隊列1的消息   * 針對消費者配置    * @return   */  @Bean   public SimpleMessageListenerContainer messageContainer2() {     SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory());     container.setQueues(queue1());     container.setExposeListenerChannel(true);     container.setMaxConcurrentConsumers(1);     container.setConcurrentConsumers(1);     container.setAcknowledgeMode(AcknowledgeMode.MANUAL); //設置確認模式手工確認     container.setMessageListener(new ChannelAwareMessageListener() {      public void onMessage(Message message, com.rabbitmq.client.Channel channel) throws Exception {        byte[] body = message.getBody();         System.out.println("queue1 收到消息 : " + new String(body));         channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); //確認消息成功消費       }     });     return container;   } }

注意,為了更好的展示如何配置,我配置了2個消息隊列,而本類除了鏈接配置哪里,其他都是針對消息消費者的,當然不管消息消費者和消息生產者都需要配置鏈接信息,而為了方便,所以本項目的消息消費者和生產者都在本項目,一般實際項目中不會在同一項目,由于注釋很詳細,我就不多說了

發送消息

為了方便發送消息,所以我直接寫了一個Controller,通過訪問接口的形式來調用發送消息的方法,話不多說,上代碼

package wang.raye.rabbitmq.demo1;import java.util.UUID;import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.rabbit.support.CorrelationData; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;/** * 測試RabbitMQ發送消息的Controller * @author Raye * */@RestControllerpublic class SendController implements RabbitTemplate.ConfirmCallback{   private RabbitTemplate rabbitTemplate;  /**   * 配置發送消息的rabbitTemplate,因為是構造方法,所以不用注解Spring也會自動注入(應該是新版本的特性)   * @param rabbitTemplate   */  public SendController(RabbitTemplate rabbitTemplate){    this.rabbitTemplate = rabbitTemplate;    //設置消費回調    this.rabbitTemplate.setConfirmCallback(this);  }  /**   * 向消息隊列1中發送消息   * @param msg   * @return   */  @RequestMapping("send1")  public String send1(String msg){    String uuid = UUID.randomUUID().toString();    CorrelationData correlationId = new CorrelationData(uuid);    rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE, RabbitMQConfig.ROUTINGKEY1, msg,        correlationId);    return null;  }  /**   * 向消息隊列2中發送消息   * @param msg   * @return   */  @RequestMapping("send2")  public String send2(String msg){    String uuid = UUID.randomUUID().toString();    CorrelationData correlationId = new CorrelationData(uuid);    rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE, RabbitMQConfig.ROUTINGKEY2, msg,        correlationId);    return null;  }  /**   * 消息的回調,主要是實現RabbitTemplate.ConfirmCallback接口   * 注意,消息回調只能代表成功消息發送到RabbitMQ服務器,不能代表消息被成功處理和接受   */  public void confirm(CorrelationData correlationData, boolean ack, String cause) {    System.out.println(" 回調id:" + correlationData);    if (ack) {      System.out.println("消息成功消費");    } else {      System.out.println("消息消費失敗:" + cause+"/n重新發送");    }  }}

需要注意的是消息回調只能代表消息成功發送到RabbitMQ服務器

然后我們啟動項目,訪問http://localhost:8082/send1?msg=aaaa 會發現控制臺輸出了

收到消息 : aaaa
 回調id:CorrelationData [id=37e6e913-835a-4eca-98d1-807325c5900f]
消息成功消費

當然回調id可能不同,如果我們訪問http://localhost:8082/send2?msg=bbbb 則輸出

queue1 收到消息 : bbbb 
 回調id:CorrelationData [id=0cec7500-3117-4aa2-9ea5-4790879812d4]
消息成功消費

最后說兩句

因為本文主要是說明如何從零到springboot集成RabbitMQ,所以對于RabbitMQ的很多信息和用法沒有說明,如果對RabbitMQ本身不太熟悉的可以去看看其他關于RabbitMQ的文章,附上本文demo

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品视频免费| 国产精品久久久久久婷婷天堂| 日本欧美一二三区| 国产成+人+综合+亚洲欧美丁香花| 日本中文字幕成人| 欧美成人免费播放| 国产成一区二区| 日韩av色综合| 国产精品久久久久7777婷婷| 精品久久久一区二区| 57pao成人国产永久免费| 亚洲人成电影网站| 1769国内精品视频在线播放| 亚洲人成网7777777国产| 欧美在线观看网址综合| 成人有码视频在线播放| 国产精品一区二区三| 欧美在线影院在线视频| 岛国av一区二区三区| 68精品久久久久久欧美| 亚洲电影中文字幕| 九九视频直播综合网| 日韩精品极品在线观看播放免费视频| 97在线视频免费播放| 久久琪琪电影院| 日韩精品视频在线播放| 在线看国产精品| 日韩成人黄色av| 日韩av影视综合网| 日韩精品亚洲视频| 久久综合网hezyo| 日本欧美中文字幕| 欧美一级成年大片在线观看| 日韩视频免费看| 国产精品久久中文| 久久久久久久久久久人体| 亚洲成人在线网| 久久视频精品在线| 国内精品久久影院| 欧美一区二区大胆人体摄影专业网站| 国产成一区二区| 欧美国产在线视频| 精品亚洲精品福利线在观看| 欧美亚洲成人xxx| 国产美女精彩久久| 国产精品美腿一区在线看| 国产精品中文字幕在线观看| 日韩亚洲一区二区| 中文字幕欧美日韩在线| 色妞欧美日韩在线| 亚洲精品福利资源站| 亚洲黄色www网站| 国产精品影片在线观看| 国产精品视频专区| 91精品视频免费看| 亚洲中国色老太| 欧美精品久久久久久久免费观看| 粉嫩老牛aⅴ一区二区三区| 欧美一级片在线播放| 日韩欧美精品网站| 欧美交受高潮1| 欧美精品久久一区二区| 91欧美日韩一区| 欧洲日本亚洲国产区| www国产亚洲精品久久网站| 国产综合久久久久久| 久久精品影视伊人网| 全亚洲最色的网站在线观看| 日韩av一区在线观看| 影音先锋日韩有码| 亚洲国产免费av| 亚洲午夜未满十八勿入免费观看全集| 欧美激情欧美狂野欧美精品| 亚洲欧洲美洲在线综合| 欧美丰满片xxx777| 亚洲欧美另类在线观看| 成人国产亚洲精品a区天堂华泰| 国内精品小视频在线观看| 日韩最新中文字幕电影免费看| 8090成年在线看片午夜| 中文综合在线观看| 九九精品视频在线观看| 伊人久久精品视频| 久久久亚洲国产天美传媒修理工| 91久热免费在线视频| 91久久中文字幕| 成人字幕网zmw| 亚洲自拍偷拍一区| 成人黄色在线观看| 日韩精品欧美国产精品忘忧草| 菠萝蜜影院一区二区免费| 亚洲成人黄色网址| 成人免费自拍视频| 成人美女免费网站视频| 久久久在线观看| 在线观看日韩视频| 国产一区二区三区在线视频| 亚洲二区在线播放视频| 欧美有码在线观看| 欧美电影免费观看高清完整| 68精品久久久久久欧美| 成人激情视频在线观看| 色综合色综合久久综合频道88| 91精品国产亚洲| 日韩激情视频在线| 92福利视频午夜1000合集在线观看| 欧美一区二粉嫩精品国产一线天| 亚洲国产欧美一区二区三区同亚洲| 美女999久久久精品视频| 久久久91精品| 91午夜在线播放| 日韩美女写真福利在线观看| 日韩欧美中文字幕在线播放| 久久久久久九九九| 亚洲精品国产精品自产a区红杏吧| 成人黄色片在线| 日韩av电影国产| 欧美综合第一页| 久久97久久97精品免视看| 国产一区二区日韩精品欧美精品| 亚洲成人av片| 欧美午夜激情视频| 98午夜经典影视| 亚洲成人久久电影| 一区二区三区久久精品| 欧美性高跟鞋xxxxhd| 亚洲欧美国产精品专区久久| 日韩黄色av网站| 欧美大全免费观看电视剧大泉洋| 欧洲亚洲妇女av| 成人淫片在线看| 国产97色在线|日韩| 91理论片午午论夜理片久久| 日韩一区二区三区在线播放| 欧美另类精品xxxx孕妇| 九九九久久国产免费| 亚洲欧美制服另类日韩| 国产精品一区二区久久久久| 欧美专区第一页| 日韩欧美一区二区三区久久| 亚洲第一网站男人都懂| 国外成人在线视频| 91伊人影院在线播放| 国产精品88a∨| 久久久久久69| 久久91亚洲精品中文字幕奶水| 日韩视频中文字幕| 青草热久免费精品视频| 日本精品免费观看| 国产亚洲精品一区二555| 中文字幕欧美精品在线| 91国自产精品中文字幕亚洲| 成人精品一区二区三区电影黑人| 在线日韩av观看| 欧美精品一区三区| 国产精品扒开腿做爽爽爽的视频| 国产欧美va欧美va香蕉在| 精品中文字幕在线观看| 成人国产精品日本在线| 亚洲自拍中文字幕| 奇米4444一区二区三区| 中文字幕日韩av电影| 中日韩美女免费视频网站在线观看| 91午夜理伦私人影院|