简介:SpringAMQP是基于RabbitMQ封装的一套模板,并且还利用SpringBoot对其实现了自动装配,使用起来非常方便。

SpringAMQP提供了三个功能:

  • 自动声明队列、交换机及其绑定关系

  • 基于注解的监听器模式,异步接收消息

  • 封装了RabbitTemplate工具,用于发送消息

部署rabbitMQ

docker run \
 -e RABBITMQ_DEFAULT_USER=remedios \
 -e RABBITMQ_DEFAULT_PASS=123456 \
 --name rabbitmq \
 --hostname rabbitmq1 \
 -p 15672:15672 \
 -p 5672:5672 \
 -d \
 rabbitmq:3-management

15672是控制台端口

输入 服务器ip:15672   访问控制台

导入依赖

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

入门案例之消息发送 

首先配置MQ地址,在publisher服务的application.yml中添加配置:

spring:
  rabbitmq:
    host: 192.168.100.101 # 主机名
    port: 5672 # 端口
    virtual-host: / # 虚拟主机
    username: remedios # 用户名
    password: 123456 # 密码

然后在publisher服务中编写测试类SpringAmqpTest,并利用RabbitTemplate实现消息发送:

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;@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringAmqpTest {@Autowiredprivate RabbitTemplate rabbitTemplate;@Testpublic void testSimpleQueue() {// 队列名称String queueName = "simple.queue";// 消息String message = "hello, spring amqp!";// 发送消息rabbitTemplate.convertAndSend(queueName, message);}
}

消息接收

在consumer服务的application.yml中添加配置:

spring:
  rabbitmq:
    host: 192.168.100.101 # 主机名
    port: 5672 # 端口
    virtual-host: / # 虚拟主机
    username: remedios # 用户名
    password: 123456 # 密码

然后在consumer服务中新建一个类SpringRabbitListener,代码如下:

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
public class SpringRabbitListener {@RabbitListener(queues = "simple.queue")public void listenSimpleQueueMessage(String msg) throws InterruptedException {System.out.println("spring 消费者接收到消息:【" + msg + "】");}
}

设置消息处理完才能获取新的消息

spring:
  rabbitmq:
    listener:
      simple:
        prefetch: 1 # 每次只能获取一条消息,处理完成才能获取下一个消息

总结

Work模型的使用:

  • 多个消费者绑定到一个队列,同一条消息只会被一个消费者处理

  • 通过设置prefetch来控制消费者预取的消息数量

发布/订阅模型

- Publisher:生产者,也就是要发送消息的程序,但是不再发送到队列中,而是发给X(交换机)
- Exchange:交换机,图中的X。一方面,接收生产者发送的消息。另一方面,知道如何处理消息,例如递交给某个特别队列、递交给所有队列、或是将消息丢弃。到底如何操作,取决于Exchange的类型。Exchange有以下3种类型:
  - Fanout:广播,将消息交给所有绑定到交换机的队列
  - Direct:定向,把消息交给符合指定routing key 的队列
  - Topic:通配符,把消息交给符合routing pattern(路由模式) 的队列
- Consumer:消费者,与以前一样,订阅队列,没有变化
- Queue:消息队列也与以前一样,接收消息、缓存消息。

Exchange(交换机)只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与Exchange绑定,或者没有符合路由规则的队列,那么消息会丢失

基于注解声明队列和交换机

Spring提供了基于注解方式来声明交换机和队列

Direct模式 可以完美替代Fanout模式

消息接收

@RabbitListener(bindings = @QueueBinding(
    value = @Queue(name = "direct.queue1"),
    exchange = @Exchange(name = "itcast.direct", type = ExchangeTypes.DIRECT),
    key = {"red", "blue"}
))
public void listenDirectQueue1(String msg){
    System.out.println("消费者接收到direct.queue1的消息:【" + msg + "】");
}

@RabbitListener(bindings = @QueueBinding(
    value = @Queue(name = "direct.queue2"),
    exchange = @Exchange(name = "itcast.direct", type = ExchangeTypes.DIRECT),
    key = {"red", "yellow"}
))
public void listenDirectQueue2(String msg){
    System.out.println("消费者接收到direct.queue2的消息:【" + msg + "】");
}

消息发送

public void testSendDirectExchange() {
    // 交换机名称
    String exchangeName = "itcast.direct";
    // 消息
    String message = "红色警报!日本乱排核废水,导致海洋生物变异,惊现哥斯拉!";
    // 发送消息
    rabbitTemplate.convertAndSend(exchangeName, "red", message);
}

Topic模式

Topic类型的ExchangeDirect相比,都是可以根据RoutingKey把消息路由到不同的队列。只不过Topic类型Exchange可以让队列在绑定Routing key 的时候使用通配符!

消息发送

public void testSendTopicExchange() {
    // 交换机名称
    String exchangeName = "itcast.topic";
    // 消息
    String message = "喜报!孙悟空大战哥斯拉,胜!";
    // 发送消息
    rabbitTemplate.convertAndSend(exchangeName, "china.news", message);
}

消息接收

@RabbitListener(bindings = @QueueBinding(
    value = @Queue(name = "topic.queue1"),
    exchange = @Exchange(name = "itcast.topic", type = ExchangeTypes.TOPIC),
    key = "china.#"
))
public void listenTopicQueue1(String msg){
    System.out.println("消费者接收到topic.queue1的消息:【" + msg + "】");
}

@RabbitListener(bindings = @QueueBinding(
    value = @Queue(name = "topic.queue2"),
    exchange = @Exchange(name = "itcast.topic", type = ExchangeTypes.TOPIC),
    key = "#.news"
))
public void listenTopicQueue2(String msg){
    System.out.println("消费者接收到topic.queue2的消息:【" + msg + "】");
}

3.6.4.总结

描述下Direct交换机与Topic交换机的差异?

  • Topic交换机接收的消息RoutingKey必须是多个单词,以 **.** 分割

  • Topic交换机与队列绑定时的bindingKey可以指定通配符

  • #:代表0个或多个词

  • *:代表1个词

消息转换器

Spring会把你发送的消息序列化为字节发送给MQ,接收消息的时候,还会把字节反序列化为Java对象。

只不过,默认情况下Spring采用的序列化方式是JDK序列化。众所周知,JDK序列化存在下列问题:

  • 数据体积过大

  • 有安全漏洞

  • 可读性差

配置JSON转换器

使用JSON方式来做序列化和反序列化。

在publisher和consumer两个服务中都引入依赖:

<dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId><version>2.9.10</version>
</dependency>

配置消息转换器。

在启动类中添加一个Bean即可:

@Bean
public MessageConverter jsonMessageConverter(){
    return new Jackson2JsonMessageConverter();
}

SpringAMQP简单入门, 使用Docker部署RabbitMQ至服务器相关推荐

  1. 使用Docker部署RabbitMQ集群

    使用Docker部署RabbitMQ集群 概述 本文重点介绍的Docker的使用,以及如何部署RabbitMQ集群,最基础的Docker安装,本文不做过多的描述,读者可以自行度娘. Windows10 ...

  2. docker 部署rabbitmq,k8s部署rabbitmq集群,跟踪和监控rabbitmq

    全栈工程师开发手册 (作者:栾鹏) 架构系列文章 rabbit原理和架构可以参考https://blog.csdn.net/luanpeng825485697/article/details/8208 ...

  3. Docker部署rabbitmq遇到的两个问题

    当使用docker部署rabbitmq时遇到两个问题,访问交换机时报错,另一种是访问channel时报错,本文给大家分享解决方案,感兴趣的朋友跟随小编一起看看吧 1.背景 Docker部署rabbit ...

  4. docker部署rabbitmq出错touch: cannot touch ‘/etc/rabbitmq/rabbitmq.conf‘: Permission denied

    docker部署rabbitmq出错touch: cannot touch '/etc/rabbitmq/rabbitmq.conf': Permission denied 首先拉取镜像,这里我使用d ...

  5. Linux centos7 docker部署gitlab私有服务器

    Docker部署gitlab私有服务器,那么,这里必须要有两个软件啦,一个是Docker,一个是gitlab.鉴于很多同学还是不太了解这两个东西,并且观看了不少的其他大神的相关博客,发现对于Docke ...

  6. 【虚拟化】docker部署Rabbitmq

    1.拉取镜像 docker pull rabbitmq:3.7.12 2.启动容器 docker run -di --name=rabbitmq -p 5671:5671 -p 5672:5672 - ...

  7. [转]docker入门(利用docker部署web应用)

    前言:本课程是在慕课网上学习 第一个docker化的java应用 课程时所做的笔记,供本人复习之用 目录 第一章 什么是docker 1.1 docker的发展史 1.2 docker国内应用史 1. ...

  8. KSO - docker部署Rabbitmq的详细讲解以及各种隐藏坑

    docker 下载rabbitmq 同时解决 解决RabbitMQ Management API returned status code 500 问题 解决 管理界面打不开 netcore 程序连接 ...

  9. Docker部署RabbitMQ

    首先拉取镜像: [root@iZ2vc97qcawcm6uqblda2fZ ~]# docker pull rabbitmq:management management: Pulling from l ...

最新文章

  1. Java中的抽象类和方法
  2. EOS 核心功能 (2) nodeos
  3. 第三次学JAVA再学不好就吃翔(part44)--匿名内部类
  4. java 手写阻塞队列_Java阻塞队列的实现
  5. (转)Spring+JDBC组合开发
  6. java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存
  7. eclipse安装Maven插件M2E
  8. 用.net中的SqlBulkCopy类批量复制数据 (转载)
  9. 【李宏毅2020 ML/DL】补充:Ensemble: Bagging, Boosting, Adaboost, Gradient Boosting, Stacking
  10. 用mapgis数据转成arcgis中shape格式的方法
  11. 微信小程序 体验版开启调试模式
  12. SLG手游策略游戏-分析思维
  13. 物联网概念的理解,物联网核心要素是什么?
  14. 4G车载信息终端TBOX车联网数据采集智能网联解决方案
  15. Keras中verbose的作用
  16. 皮克定理,多边形面积以及线段上整点个数
  17. 洛谷P3387 【模板】缩点 题解
  18. 【Java Web 安全】常见安全漏洞及解决方案
  19. 记录-学习《体验助力传统行业智能化转型》 AlibabaDesign
  20. 为不同大小的图片添加纯色背景

热门文章

  1. JS:判断是否是移动端
  2. ubuntu apt update时W: GPG error http://ppa.launchpad.net lucid Release没有公钥无法验证NO_PUBKEY签名问题解决
  3. 高等数学——平面曲线的弧长的计算
  4. 如何解决MathType公式显示方框
  5. 【教程】GF-1和GF-2PMS数据预处理全流程
  6. 猫和路由器和交换机有什么区别
  7. 16亿乐透大奖有独主,也有人输(哭)的响亮
  8. [深度学习 - 发现有趣项目] masking-gan 人脸生成笑脸表情
  9. 给vscode设置背景图片~~贼好用
  10. 数据开放共享的重要性_为什么今天开放数据很重要