Spring Boot 与消息 (JMS、AMQP、RabbitMQ)

RabbitMQ教程 - 鸟哥的专栏 - CSDN博客

一、概述

  1. 大多应用中,可通过消息服务中间件来提升系统异步通信、扩展解耦能力
  2. 消息服务中两个重要概念:
    1. 消息代理(message broker)和目的地(destination)
    2. 当消息发送者发送消息以后,将由消息代理接管,消息代理保证消息传递到指定目
      的地。

       
  3. 消息队列主要有两种形式的目的地
    1. 队列(queue):点对点消息通信(point-to-point)
    2. 主题(topic):发布(publish) /订阅(subscribe)消息通信

 

二、应用场景图解:

 

 

 

4. 点对点式:

  • 消息发送者发送消息,消息代理将其放入一个队列中,消息接收者从队列中获取消息内容, 消息读取后被移出队列
  • 消息只有唯一的_和接受者,但并不是说只能有一个接收者


5. 发布订阅式:

  • 发送者(发布者)发送消息到主题,多个接收者(订阅者)监听(订阅)这个主题,那么就会在消息到达时同时收到消息

6. JMS (Java Message Service) JAVA消息服务:

  • 基于JVM消息的规范 。ActiveMQ、HornetMQ是JMS实现


7. AMQP (Advanced Message Queuing Protocol)

  • 高级消息队列协议,也是一个消息代理的规范,兼容JMS
  • RabbitMQ 是 AMQP 的实现

 

JMS & AMQP区别 

 

 

 

 8. Spring 支持

  • spring-jms提供了JMS的支持
  • spring-rabbit提供了AMQP的支持
  • 需要ConnectionFactory的实现来实现代理
  • 提供JmsTemplate、RabbitTemplate来发送消息
  • @JmsListener(JMS) 、@RabbitListener (AMQP)注解在方法上监听消息代理发布的消息
  • @EnableJms、@EnableRabbit开启支持

9. Spring Boot 配置

  • JmsAutoConfiguration
  • RabbitAutoConfiguration

 

 

三、Rabbit MQ 简介

 

rabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue Protocol)的开源实现

1. Message

   消息,消息是不具名的,它由消息头和消息体组成。消息体不是透明的,而消息体则是由一系列的可选属性组成,这些属性包括routing-key(路邮键)、priority(相对于其它消息的优先权)、delivery-mode(指出该消息可能需要持久性存储)等。

 

2. Publisher

   消息的生产者,也是一个向交换器发布消息的客户端应用程序

3. Exchange

  交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。有4种里类型:direct(默认)、fanout、topic、headers,不同类型的Exchange转发消息策略有所区别。

 

4. queue

消息队列,用来保存消息,直到发送给消费者。它是消息容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将消息取走。

5. Binding

绑定,用于消息队列和交换器:Exchange之间的关联。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表。

Exchange和Binding的关系可以是多对多

 

6. Connection

网络连接,比如一个TCP连接

 

7. Channle

信道,多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内的虚拟连接,AMQP命令都是通过信道发送出去的。不管是发布消息,订阅队列、还是接收消息,这些动作都是通过信道完成。因为对于操作系统来说建立和销毁TCP都是非常昂贵的开销,所以引入了信道概念,以复用一条TCP连接。

 

8. Consumer

消息的消费者,表示一个从消息队列中取得消息的客户端应用程序。

 

9. Virtual Host

虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个Vhost本质上就是一个mini的RabbitMQ服务器,拥有自己的队列、交换器、绑定和权限机制。vhost是AMQP概念的基础,必须在连接时指定,RabbitMQ默认的 vhost是/。

10. Broker

表示消息队列服务器实体

 

 

 

四、RabbitMQ运行机制

AMQP中的消息路由

  • AMQP中消息的路由过程和Java开发者熟悉的JMS存在一些差别,AMQP增加了ExchangeBinding的角色,生产者把消息发送到Exchange上,消息队列最终到达队列并被消费者接收,而Binding决定交换器的消息应该发送到哪个队列。

 

 Exchange模型

Exchange分发消息时根据类型的不同分发策略也有所区别,目前有四种类型:direct、fanout、topic、headers。Headers匹配AMQP消息的header而不是路由键,headers交换器和direct交换器完全一致,但性能差很多,目前几乎用不到了,所以直接看另外三种类型:

1. Direct Exchange 

消息中的路由键(routing key)如果和Binding中的bingding key一致,交换器就将消息发到对应的队列中。路由键与队列名完全匹配,如果一个队列绑定到交换机要求路由键为dog,则只转发routing key为dog的消息,不会转发dog.puppy,也不会转发dog.guard等等。它是完全匹配,单播的模式。

 

2.fanout Exchange

每个发到fanout类型交换器的消息都会分到所有绑定的队列上去。fanout交换器不处理路由键,只是简单地将队列绑定到交换器上去,每个发送到交换器的消息都会被转发到该交换器绑定的所有队列上。很像子网广播,每台子网内的主机都获得了一份复制消息。fanout类型转发消息是最快的。

 

 

3. Topic Exchange

Topic交换器通过模式匹配分配消息的路由键属性,将路由键和某个模式匹配,此时队列需要绑定到一个模式上。它将路由键和绑定键的字符串切分成单词,这些单词之间用点隔开。同样也会识别2个通配符:符号“#”和符号“*”。#匹配0个或多个单词,*匹配一个单词。

 

 

 

五、安装启动运行ActiveMQ

1. 官网下载ActiveMQ独立运行包

wget rabbitmq-server-mac-standalone-3.7.17.tar.xz
tar -zxvf rabbitmq-server-mac-standalone-3.7.17.tar.xz
cd rabbitmq_server-3.7.17/sbin
./rabbitmq-server  #启动服务./rabbitmq-plugins list #查看所有插件
./rabbitmq-plugins enable rabbitmq_management #启动web端管理插件

 

2. 添加exchange

 

3. 添加队列

4. exchange中向queue发布消息

 

 

 

5. 获取消息 

 

 

 

 

六、RabbitMQ 整合

1. 引入spring-boot-starter-amqp

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>

 

2.application.yml配置

spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.host=localhost

 

3. 测试RabbitMQ

AmqpAdmin:管理组件

RabbitTemplate:消息发送处理组件

package com.everjiankang.amqp;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import java.util.HashMap;
import java.util.Map;@RunWith(SpringRunner.class)
@SpringBootTest
public class AmqpApplicationTests {//private MessageConverter messageConverter = new SimpleMessageConverter();
    @AutowiredRabbitTemplate template;@Testpublic void sendMsg() {/*Message需要自己构造一个;定义消息体内容和消息头*///template.send(exchange,routingKey,message);/* object默认被当成消息体,只需要传入发送的对象,自动序列化发送给rabbitmq *///template.convertAndSend(exchange,routingKey,object);
Map<String,Object> map = new HashMap();map.put("name","xiaochao");map.put("age",20);map.put("sex","男");map.put("msg","我爱你中国");//对象被默认序列化以后发送出去template.convertAndSend("exchange.direct","atguigu.news",map);}/*** 获取消息*/@Testpublic void receiveMsg() {Object o = template.receiveAndConvert("atguigu.news");System.out.println(o.getClass());System.out.println(o);}
}

 

 

查看队列:

get Message

 

 乱码原因:序列号采用了JDK本身的序列化机制

解决乱码:更换SimpleMessageConverter ——> Jackson2JsonMessageConverter

 

 

@Configuration
public class MyConfig {@Beanpublic MessageConverter getMessageConverter() {return new Jackson2JsonMessageConverter();}
}

 

 

 

转载于:https://www.cnblogs.com/guchunchao/p/11301272.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363266.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Apache Camel通过soap添加WS-Security

WS-Security&#xff08;Web服务安全性&#xff09;是一种协议&#xff0c;可让您保护自己的soap Web服务。 发出Soap请求的客户端必须在Soap标头中提供登录名和密码。 服务器接收到肥皂请求&#xff0c;检查凭据并验证请求是否正确。 使用Apache Camel&#xff0c;可以很容易…

课时3.浏览器访问网页原理(理解)

浏览器访问网页原理&#xff08;理解&#xff09; 第一次打开IE6&#xff0c;发现系统自动生成了一个文件夹&#xff0c;所以我们可以得出这个文件夹必然和IE6有一定的关系先删除Internet Cache下的所有文件夹&#xff0c;然后通过IE6打开百度的首页&#xff0c;打开百度首页以…

matlab 图像平移操作

目标&#xff1a;对原图I进行[80,50]的偏移操作得到图B。 首先读入图像&#xff0c;以matlab自带的pout.tif为例. strel是创建形态学结构元素的. translate函数在原结构上进行[80,50]的偏移. I imread(cameraman.tif); se translate(strel(1),[80,50]); B imdilate(I,se);转…

爬虫之基于线程池异步抓取

from multiprocessing.dummy import Pool #线程池模块#必须只可以有一个参数 def my_requests(url):return requests.get(urlurl,headersheaders).textstart time.time() urls [http://127.0.0.1:5000/bobo,http://127.0.0.1:5000/jay,http://127.0.0.1:5000/tom, ]pool Poo…

使用xjc一秒钟生成您的JAXB类

由于JAXB是JDK的一部分&#xff0c;因此它是处理XML文档最常用的框架之一。 它提供了一种从XML文档检索数据并将其存储到Java类的简便方法。 因为几乎每个Java开发人员都已经使用过JAXB&#xff0c;所以我不会解释不同的JAXB批注。 相反&#xff0c;我将专注于一个名为xjc的命令…

课时27.base(掌握)

base标签就是专门用来统一的指定当前网页中所有的超链接&#xff08;a标签&#xff09;需要如何打开格式 <base target"_blank"> <a href"https://www.baidu.com">百度</a> 注意点&#xff1a; base标签必须写在head标签的开始标签和…

async await详解

async await本身就是promise generator的语法糖。 本文主要讲述以下内容 async awiat 实质async await 主要特性async await 实质 下面使用 promise generate 实现 async await // 转换目标 async1// async function async1() {// console.log(async1 start);// await …

JavaOne 2014 –有关提交的一些初步分析

这些天时间不多了。 并行发生的事情如此之多&#xff0c;当然&#xff0c;最重要的Java会议就是一切。 JavaOne 2014已经关闭了CfP门&#xff0c;投票正在进行中。 程序委员会几乎没有什么可以谈论的&#xff0c;但是去年跳过了这种分析之后&#xff0c;现在是我该寻求许可的时…

【搜索】$P1092$虫食算

【搜索】\(P1092\)虫食算 题目链接 首先&#xff0c;我们只考虑加法的虫食算。这里的加法是N进制加法&#xff0c;算式中三个数都有N位&#xff0c;允许有前导的0。 其次&#xff0c;虫子把所有的数都啃光了&#xff0c;我们只知道哪些数字是相同的&#xff0c;我们将相同的数字…

【译】XNA Shader 程序设计(二)

XNA Shader 程序设计 教程2 - 漫反射 大家好&#xff0c;今天我们将在教程一的基础上继续学习&#xff0c;在光照算式中加上漫反射光。 漫反射光 环境光计算等式为&#xff1a; I Aintensity * Acolor 漫反射基于这个等式&#xff0c;添加了一道有方向的光线&#xff1a; I A…

Jquery基础之DOM操作

Dom是Document Object Model的缩写&#xff0c;意思是文档对象模型。DOM是一种与浏览器、平台、语言无关的接口&#xff0c;使用该接口可以轻松访问页面中所有的标准组件。DOM操作可以分为三个方面即DOM Core(核心)、HTM-DOM和CSS-DOM。 JQuery中的DOM操作主要对包括&#xff…

linux 下 `dirname $0` shell 获取当前正在执行脚本的绝对路径

【】&#xff0c;学名叫“倒引号”&#xff0c; 如果被“倒引号”括起来&#xff0c; 表示里面需要执行的是命令。比如 dirname $0&#xff0c; 就表示需要执行 dirname $0 这个命令【“”】 &#xff0c; 被双引号括起来的内容&#xff0c; 里面 出现 $ (美元号&#xf…

具有angularjs资源的Spring Rest Controller

Angularjs ngResource是用于与基于REST的服务进行交互的angularjs模块。 我最近在Spring MVC的一个小型项目中使用了它&#xff0c;并希望记录一个对我来说很好的配置。 该控制器在工厂中运行&#xff0c;它支持在酒店实体上进行CRUD操作&#xff0c;并支持以下方法&#xff1…

PAT乙级1023

题目链接 https://pintia.cn/problem-sets/994805260223102976/problems/994805298269634560 题解 主要就是控制首位不能为0&#xff0c;其他的都很简单&#xff0c;就遍历然后往尾部加数字就好了。 // PAT BasicLevel 1023 // https://pintia.cn/problem-sets/994805260223102…

js中var、let、const区别

//1.var定义的变量可以修改&#xff0c;如果不初始化会输出undefined&#xff0c;不会报错。 var a; console.log(a); //undefined//2.let是块级作用域&#xff0c;函数内部使用let定义后&#xff0c;对函数外部无影响。 let c 3; console.log(c)function change(){ let c 6;…

2000错误信息:MMC创建无法管理单元。

系统Vista&#xff0c;安装了SQL Server 2000 SP4&#xff0c;然后安装了Microsoft SQL Server 2005。后因系统太慢&#xff0c;卸载SQL SERVER2005,结果在打开 SQLServer2000的 企业管理器&#xff0c;收到以下错误信息&#xff1a;MMC创建无法管理单元。到网上寻找了以后&…

A股滚动净利润增速最高排名

最近2年&#xff08;共8个季度&#xff09;的滚动净利润都在增长&#xff0c;且平均增速超过10%。 计算举例&#xff1a;滚动净利润增速 ((2018Q1 到 2018Q4的净利润之和) / (2017Q4 到 2018Q3的净利润之和) -1) * 100%。 预测下季度&#xff1a;依据以往的增速&#xff0c;进…

Java 8 Friday:让我们弃用那些旧版库

在Data Geekery &#xff0c;我们喜欢Java。 而且&#xff0c;由于我们真的很喜欢jOOQ的流畅的API和查询DSL &#xff0c;我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 Java 8星期五 每个星期五&#xff0c;我们都会向您展示一些不错的教程风格的Java 8新功能&#…

Navicat for MySQL v8.0.27 的注册码

Navicat for MySQL v8.0.27 的注册码 Navicat是一个强大的MySQL数据库管理和开发工具。Navicat为专业开发者提供了一套强大的足够尖端的工具&#xff0c;但它对于新用户仍然是易于学习。Navicat,使用了极好的图形用户界面&#xff08;GUI&#xff09;&#xff0c;可以让你用一种…

Educational Codeforces Round 10

652A - Gabriel and Caterpillar 20171128 按题意模拟即可 #include<stdlib.h> #include<stdio.h> #include<math.h> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int h1,h2,a,b,ans1; int main()…