最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Boot系列教程之7步集成RabbitMQ的方法

 更新時間:2018年11月12日 11:44:59   作者:JackieZheng  
RabbitMQ 即一個消息隊列,主要是用來實現(xiàn)應用程序的異步和解耦,同時也能起到消息緩沖,消息分發(fā)的作用。下面這篇文章主要給大家介紹了關于Spring Boot之7步集成RabbitMQ的相關資料,需要的朋友可以參考下

前言

RabbitMQ是一種我們經(jīng)常使用的消息中間件,RabbitMQ是實現(xiàn)AMQP(高級消息隊列協(xié)議)的消息中間件的一種,最初起源于金融系統(tǒng),用于在分布式系統(tǒng)中存儲轉(zhuǎn)發(fā)消息,在易用性、擴展性、高可用性等方面表現(xiàn)不俗。RabbitMQ主要是為了實現(xiàn)系統(tǒng)之間的雙向解耦而實現(xiàn)的。當生產(chǎn)者大量產(chǎn)生數(shù)據(jù)時,消費者無法快速消費,那么需要一個中間層。保存這個數(shù)據(jù)。

AMQP,即Advanced Message Queuing Protocol,高級消息隊列協(xié)議,是應用層協(xié)議的一個開放標準,為面向消息的中間件設計。消息中間件主要用于組件之間的解耦,消息的發(fā)送者無需知道消息使用者的存在,反之亦然。AMQP的主要特征是面向消息、隊列、路由(包括點對點和發(fā)布/訂閱)、可靠性、安全。

RabbitMQ是一個開源的AMQP實現(xiàn),服務器端用Erlang語言編寫,支持多種客戶端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系統(tǒng)中存儲轉(zhuǎn)發(fā)消息,在易用性、擴展性、高可用性等方面表現(xiàn)不俗。

今天這篇,我們來看看Spring Boot是如何集成RabbitMQ,發(fā)送消息和消費消息的。同時我們介紹下死信隊列。

集成RabbitMQ

集成RabbitMQ只需要如下幾步即可

1、添加maven依賴

<!--rabbitmq-->

<dependency>

 <groupId>org.springframework.boot</groupId>

 <artifactId>spring-boot-starter-amqp</artifactId>

</dependency>

2、添加配置文件application.yaml

在application.yaml添加配置內(nèi)容如下

spring: rabbitmq:
 host: 192.168.1.161
 port: 5672
 username: guest
 password: guest
 cache:
 channel: size: 10
 listener:
 type: simple
 simple:
 acknowledge-mode: auto
 concurrency: 5
 default-requeue-rejected: true
 max-concurrency: 100
 retry:
 enabled: true # initial-interval: 1000ms
 max-attempts: 3 # max-interval: 1000ms
 multiplier: 1
 stateless: true # publisher-confirms: true</pre>

注意:

這里最基本的配置只需要配置host,port,username和password四個屬性即可

其他屬性都有各自的含義,比如retry是用于配置重試策略的,acknowledge-mode是配置消息接收確認機制的。

3、編寫配置類

編寫RabbitConfig配置類,采用Java Configuration的方式配置RabbitTemplate、Exchange和Queue等信息,具體如下所示

package com.jackie.springbootdemo.config;

import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

import java.util.HashMap;
import java.util.Map;

@Configuration public class RabbitMQConfig implements InitializingBean { @Autowired
 SimpleRabbitListenerContainerFactory simpleRabbitListenerContainerFactory;

 @Override
 public void afterPropertiesSet() throws Exception {
 simpleRabbitListenerContainerFactory.setMessageConverter(new Jackson2JsonMessageConverter());
 } @Bean("jackson2JsonMessageConverter")
 public Jackson2JsonMessageConverter jackson2JsonMessageConverter(ConnectionFactory connectionFactory) {
 return new Jackson2JsonMessageConverter();
 } @Bean("rabbitTemplate")
 @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
 public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory,
  @Qualifier("jackson2JsonMessageConverter") Jackson2JsonMessageConverter jackson2JsonMessageConverter) {
 RabbitTemplate template = new RabbitTemplate(connectionFactory);
 template.setMessageConverter(new Jackson2JsonMessageConverter());
 return template;
 } // --------------------- 聲明隊列 ------------------------
 @Bean
 public Queue demoQueue() {
 return new Queue("demo_queue");
 } // --------------------- 聲明exchange ------------------------ @Bean
 public DirectExchange demoExchange() {
 return new DirectExchange("demo_exchange");
 } // --------------------- 隊列綁定 ------------------------
 @Bean
 public Binding bindingAlbumItemCreatedQueue(DirectExchange demoExchange,
  Queue demoQueue) {
 return BindingBuilder.bind(demoQueue).to(demoExchange).with("100");
 } }

注意

這里聲明了Direct模式的Exchange,聲明一個Queue,并通過routing-key為100將demo_queue綁定到demo_exchange,這樣demo_queue就可以接收到demo_exchange發(fā)送的消息了。

4、編寫消息發(fā)送類

package com.jackie.springbootdemo.message;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
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 { private RabbitTemplate rabbitTemplate;

 /**
 * 構造方法注入 */ @Autowired
 public Sender(RabbitTemplate rabbitTemplate) {
 this.rabbitTemplate = rabbitTemplate;
 rabbitTemplate.setConfirmCallback(this); //rabbitTemplate如果為單例的話,那回調(diào)就是最后設置的內(nèi)容
 } public void sendMsg(String content) {
 rabbitTemplate.convertAndSend("demo_exchange", "100", content);
 } /**
 * 回調(diào) */ @Override
 public void confirm(CorrelationData correlationData, boolean ack, String cause) {
 System.out.println(" 回調(diào)id:" + correlationData);
 if (ack) {
 System.out.println("消息成功消費");
 } else {
 System.out.println("消息消費失敗:" + cause);
 }
 } }

注意

發(fā)送內(nèi)容content,路由到routing-key為100上,則我們就可以在demo_queue隊列中看到發(fā)送的消息內(nèi)容了

confirm函數(shù)是回調(diào)函數(shù),這里因為沒有消費者,且acknoledge-mode是auto(其他兩種值分別是none和manual),所以ack是false。

5、編寫發(fā)送消息測試類

package com.jackie.springbootdemo;

import com.jackie.springbootdemo.message.Sender;
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.SpringRunner;
import org.springframework.test.context.web.WebAppConfiguration;

@RunWith(SpringRunner.class) @SpringBootTest(classes = SpringbootDemoApplication.class) @WebAppConfiguration public class RabbitApplicationTests { @Autowired
 Sender sender;

 @Test
 public void contextLoads() throws Exception {
 sender.sendMsg("test");
 } } 

運行該測試類,我們可以看到如下結(jié)果

6、編寫消息消費類

package com.jackie.springbootdemo.message;

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

@Component public class Receiver { @RabbitListener(queues = "demo_queue")
 public void created(String message) {
 System.out.println("orignal message: " + message);
 } } 

注意

消息消費類也非常簡單,添加注解@RabbitListener,指定要監(jiān)聽的隊列名稱即可

除了注解@RabbitListener,我們經(jīng)常還能看到@RabbitHandler,這兩個注解可以配合起來使用。

@RabbitListener 標注在類上面表示當有收到消息的時候,就交給 @RabbitHandler 的方法處理,具體使用哪個方法處理,根據(jù) MessageConverter 轉(zhuǎn)換后的參數(shù)類型,形如

@RabbitListener(queues = "demo_queue") public class Receiver { @RabbitHandler public void processMessage1(String message) {
 System.out.println(message);
 } @RabbitHandler
 public void processMessage2(byte[] message) {
 System.out.println(new String(message));
 } }

7、運行消息發(fā)送測試類

從執(zhí)行結(jié)果可以看到,因為有了消費者,所以這次打印的結(jié)果是"消息消費成功"

而且,我們看到Receiver類將消息消費并打印出消息的內(nèi)容為"test"。

代碼已經(jīng)提交至項目rome:https://github.com/DMinerJackie/rome (本地下載

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關文章

  • Java移位運算符詳解實例(小結(jié))

    Java移位運算符詳解實例(小結(jié))

    這篇文章主要介紹了Java移位運算符詳解實例(小結(jié)),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • 詳解SpringBoot?統(tǒng)一后端返回格式的方法

    詳解SpringBoot?統(tǒng)一后端返回格式的方法

    今天我們來聊一聊在基于SpringBoot前后端分離開發(fā)模式下,如何友好的返回統(tǒng)一的標準格式以及如何優(yōu)雅的處理全局異常,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2022-05-05
  • Java實現(xiàn)支付寶之第三方支付寶即時到賬支付功能

    Java實現(xiàn)支付寶之第三方支付寶即時到賬支付功能

    這篇文章主要介紹了Java實現(xiàn)支付寶之第三方支付寶即時到賬支付功能的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • Java基礎篇之反射機制詳解

    Java基礎篇之反射機制詳解

    本文詳細講解了Java基礎篇之反射機制,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • Java實現(xiàn)多文件壓縮加密并重命名壓縮文件對象的方法

    Java實現(xiàn)多文件壓縮加密并重命名壓縮文件對象的方法

    這篇文章主要介紹了Java實現(xiàn)多文件壓縮加密并重命名壓縮文件對象的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • java之左旋轉(zhuǎn)字符串介紹

    java之左旋轉(zhuǎn)字符串介紹

    java之左旋轉(zhuǎn)字符串介紹,需要的朋友可以參考一下
    2013-02-02
  • SpringBoot集成RocketMQ實現(xiàn)消息發(fā)送的三種方式

    SpringBoot集成RocketMQ實現(xiàn)消息發(fā)送的三種方式

    RocketMQ?支持3?種消息發(fā)送方式:?同步?(sync)、異步(async)、單向(oneway),本文就將給大家介紹一下SpringBoot集成RocketMQ實現(xiàn)消息發(fā)送的三種方式文中有詳細的代碼示例,需要的朋友可以參考下
    2023-09-09
  • java中Calendar與Date類型互相轉(zhuǎn)換的方法

    java中Calendar與Date類型互相轉(zhuǎn)換的方法

    這篇文章主要介紹了java中Calendar與Date類型互相轉(zhuǎn)換的方法,Calendar與Date類型是我們?nèi)粘i_發(fā)中常用的兩種數(shù)據(jù)類型,它們用于不同的場景,兩者具有不同的方法,接下來通過實例給大家詳解,需要的朋友可以參考下
    2022-09-09
  • 在Java中Scanner的用法總結(jié)

    在Java中Scanner的用法總結(jié)

    這篇文章主要介紹了在Java中Scanner的用法總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • idea打不開雙擊IDEA圖標沒反應的快速解決方案

    idea打不開雙擊IDEA圖標沒反應的快速解決方案

    這篇文章主要介紹了idea打不開雙擊IDEA圖標沒反應的快速解決方案,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12

最新評論

三河市| 恩平市| 梅河口市| 泗阳县| 潮州市| 青铜峡市| 定南县| 麻栗坡县| 乌拉特前旗| 会宁县| 胶南市| 新兴县| 临朐县| 南昌市| 潜江市| 周宁县| 芮城县| 湘西| 曲麻莱县| 民勤县| 雅安市| 安阳市| 平遥县| 通海县| 陆丰市| 霍邱县| 西丰县| 迭部县| 金川县| 抚松县| 泸水县| 白山市| 嫩江县| 犍为县| 阳曲县| 凤冈县| 额济纳旗| 和静县| 沾化县| 同仁县| 兰溪市|