1、RabbitMQ相关介绍

(1)RabbitMQ整体上是一个生产者和消费者模型,主要负责接收、存储、转发消息。RabbitMQ整体结构图如下:

 

(2)生产者:发送消息的一方,生产者创建一条消息,发布到RabbitMQ上,消息一般分为两部分:消息体和标签,消息体是带有业务逻辑结构的数据,也可以进一步对消息体进行序列化,标签用来描述这条消息。

     消费者:接收消息的一方,消费者创建一条连接,接到RabbitMQ服务器上的队列上,当消费者消费一条队列上的消息时,只是消费消息体,标签自动丢弃,所以消费者不会知道生产者是谁。

    Broker:消息中间服务节点,一个RabbitMQ Broker可以看作是一个RabbitMQ的实例,也可看作一台rabbitMQ的服务器。

    队列:Queue,RabbitMQ的内部对象,用于存储消息。多个消费者可以订阅一个队列,不支持队列层面的广播消费。

    交换器:Exchange,生产者创建消息,把消息交给交换器,有交换器把消息发送到一个或多个队列上。如果交换器发送队列失败,消息会返回给生产者或者丢弃。RabbitMQ中交换器有四种类型:fanout、direct、topic、headers。

    fanout:四种交换器中其一,会把消息发送到所有与交换器绑定的队列上。

    direct:四种交换器其二,会把消息发送到bindingKey和RoutingKey完全匹配的队列上。

    topic:四种交换器其三,与direct相似,会把消息发送到bindingKey和RoutingKey完全匹配的队列上,但匹配规则不同。

    headers:四种交换器其四,根据消息中的headers的属性来进行匹配,性能差,基本不会使用。

    bindingKey:绑定键,RabbitMQ中通过绑定键把交换器和对列关联起来,与RoutingKey配合使用。

    RoutdingKey:路由键,生产者将消息发送给交换器时会指定一个RoutingKey,当bindingKey和RoutingKey完全匹配时,消息会被放到对应的队列上。

1、SpringBoot整合RabbitMQ

(1)环境配置

项目采用maven构建系统,所以需要在pom.xml的文件中引入RabbitMQ的相关依赖:

<!--引入RabbitMQ的相关依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
在application.yml中配置RabbitMQ相关信息:
Spring:
  rabbitmq:
    host: 127.0.0.1
    port: 5727
    username: guest
    password: guest

(2)初始化RabbitMQ连接

public class RabbitMQConfig {
Logger logger = LoggerFactory.getLogger(RabbitMQConfig.class);
@Value("${spring.rabbitmq.host}")
private String host;
@Value("${spring.rabbitmq.port}")
private int port;
@Value("${spring.rabbitmq.username}")
private String username;
@Value("${spring.rabbitmq.password}")
private String password;
/**
* rabbitmq连接
* */
@Bean
public Connection rabbitMQ_Config(){
ConnectionFactory factory = new ConnectionFactory();
factory.setHost(host);
factory.setPort(port);
factory.setUsername(username);
factory.setPassword(password);
Connection conn = null;
try {
//创建连接
conn = factory.newConnection();
} catch (IOException e) {
logger.error("创建MQ连接失败!",e);
e.printStackTrace();
} catch (TimeoutException e) {
logger.error("创建MQ连接失败!",e);
e.printStackTrace();
}
return conn;
}
@Bean
/**
* rabbitmq连接.uri方式
* */
public Connection rabbitMQ_Config_Uri(){
ConnectionFactory factory = new ConnectionFactory();
Connection conn = null;
try {
factory.setUri("amqp://"+username+":"+password+"@"+host+":"+port+"/virtualHost");
try {
conn = factory.newConnection();
} catch (IOException e) {
logger.error("创建MQ连接失败!",e);
e.printStackTrace();
} catch (TimeoutException e) {
logger.error("创建MQ连接失败!",e);
e.printStackTrace();
}
} catch (URISyntaxException e) {
logger.error("创建MQ连接失败!",e);
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
logger.error("创建MQ连接失败!",e);
e.printStackTrace();
} catch (KeyManagementException e) {
logger.error("创建MQ连接失败!",e);
e.printStackTrace();
}
return conn;
}
}

(3)生产者

/**
* 生产者
* */
@Bean
public boolean direct_MQ_Producer(String excahngeName, String exchangeType,String Queue,String Binding,byte[] array) throws Exception{

boolean flag = false;
Connection con = rabbitMQ_Config();
//创建通道
Channel channel = con.createChannel();
try {
//创建交换机
channel.exchangeDeclare(excahngeName,exchangeType,true);
//创建队列
channel.queueDeclare(Queue,true,false,false,null);
//将交换机与队列绑定
channel.queueBind(Queue,excahngeName,Binding);
//发送消息
channel.basicPublish(excahngeName,Binding, MessageProperties.PERSISTENT_TEXT_PLAIN,array);
flag = true;
} catch (IOException e) {
logger.error("发送消息失败!",e);
e.printStackTrace();
}finally {
//关闭通道连接
channel.close();
//关闭连接
con.close();
}
return flag;
}

(4)消费者   

/**
* 推模式消费者,一次消费多条
* */
@Bean
public String[] direct_MQ_Consumer(String Queue) throws IOException, TimeoutException {
Connection con = rabbitMQ_Config();
Channel channel = null;
final String[] message = {""};
try {
channel = con.createChannel();
//设置客户端最多接收未被接收的数目
channel.basicQos(64);
Channel finalChannel = channel;
//通过重写DefaultConsumer方法来实现消费者消息
Consumer consumer = new DefaultConsumer(finalChannel){
@Override
public void handleDelivery(String s1, Envelope envelope1, AMQP.BasicProperties basicProperties1, byte[] bytes) throws IOException{
message[0] = new String(bytes);
System.out.println("recv messahe : " + new String(bytes));
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
finalChannel.basicAck(envelope1.getDeliveryTag(),false);
}
};
channel.basicConsume(Queue,consumer);
TimeUnit.SECONDS.sleep(5);
} catch (IOException e) {
logger.error("创建通道失败!",e);
e.printStackTrace();
}catch (InterruptedException e) {
e.printStackTrace();
}finally {
//关闭资源
channel.close();
con.close();
}
return message;
}

/**
* 拉模式消费者,一次消费一条
*
* */
@Bean
public String direct_MQ_Consumer1(String Queue) throws IOException, TimeoutException {
Connection con = rabbitMQ_Config();
Channel channel = null;
String message = "";
try {
channel = con.createChannel();
GetResponse getResponse = channel.basicGet(Queue,false);
message = new String(getResponse.getBody());
channel.basicAck(getResponse.getEnvelope().getDeliveryTag(),false);
TimeUnit.SECONDS.sleep(5);
} catch (IOException e) {
logger.error("创建通道失败!",e);
e.printStackTrace();
}catch (InterruptedException e) {
e.printStackTrace();
}finally {
//关闭资源
channel.close();
con.close();
}
return message;
}

RabbitMQ小记(二)的更多相关文章

  1. RabbitMQ(二)

    一.启用 rabbitmq_management 插件(官网提供的 web 版管理工具) cd /usr/sbin rabbitmq-plugins enable rabbitmq_managemen ...

  2. 消息队列的使用 RabbitMQ (二): Windows 环境下集群的实现

    一.RabbitMQ 集群的基本概念 一个 RabbitMQ 中间件(broker) 由一个或多个 erlang 节点组成,节点之间共享 用户名.虚拟目录.队列消息.运行参数 等, 这个 节点的集合被 ...

  3. SpringBoot集成rabbitmq(二)

    前言 在使用rabbitmq时,我们可以通过消息持久化来解决服务器因异常崩溃而造成的消息丢失.除此之外,我们还会遇到一个问题,当消息生产者发消息发送出去后,消息到底有没有正确到达服务器呢?如果不进行特 ...

  4. python使用rabbitMQ介绍二(工作队列模式)

    一模式介绍 第一章节的生产-消费者模式,是非常简单的模式,一发一收.在实际的应用中,消费者有的时候需要工作较长的时间,则需要增加消费者. 队列模型: 这时mq实现了一下几个功能: rabbitmq循环 ...

  5. RabbitMQ (十二) 消息确认机制 - 发布者确认

    消费者确认解决的问题是确认消息是否被消费者"成功消费". 它有个前提条件,那就是生产者发布的消息已经"成功"发送出去了. 因此还需要一个机制来告诉生产者,你发送 ...

  6. Rabbitmq笔记二

    消息何去何从 mandatory 和 immediate 是 channel . basicPublish 方法中的两个参数,它们都有 当消息传递过程中不可达目的地时将消息返回给生产者的功能. 当 m ...

  7. RabbitMQ系列(二)--基础组件

    声明:对于RabbitMQ的学习基于某课网相关视频和<RabbitMQ实战指南>一书,后续关于RabbitMQ的博客都是基于二者 一.什么是RabbitMQ RabbitMQ是开源代理和队 ...

  8. RabbitMq应用二

    在应用一中,基本的消息队列使用已经完成了,在实际项目中,一定会出现各种各样的需求和问题,rabbitmq内置的很多强大机制和功能会帮助我们解决很多的问题,下面就一个一个的一起学习一下. 消息响应机制 ...

  9. RabbitMQ(二) -- Work Queues

    RabbitMQ(一) -- Work Queues RabbitMQ使用Work Queues的主要目的是为了避免资源使用密集的任务,它不同于定时任务处理的方式,而是把任务封装为消息添加到队列中.而 ...

随机推荐

  1. IDEA 代码自动补全/自动联想 功能

    IDEA 的代码补全/自动联想功能,可以仅仅输入几个字母,自动补全一整段代码,非常舒服. 代码自动联想功能在 设置 -> Editor -> Live Templates 查看,很多都非常 ...

  2. C# Mongo DB 修改多层嵌套集合中的字段

    C# Mongo DB 修改嵌套集合中的字段 虽然c#的mongo 驱动很强大,而且还支持linq,但是一些复杂的操作语句还是比较困难 这里我用Bson实现功能 这是模型(我这里有多层嵌套) publ ...

  3. 史上!最最最简洁明了的 Java JDK 安装目录及其子目录含义 10分钟详解 - 精简归纳

    Java JDK 安装目录及其子目录含义 10分钟详解 - 精简归纳 JERRY_Z. ~ 2020 / 8 / 30 转载请注明出处!️ 目录 Java JDK 安装目录及其子目录含义 10分钟详解 ...

  4. 【Go语言入门系列】(七)如何使用Go的方法?

    [Go语言入门系列]前面的文章: [Go语言入门系列](四)之map的使用 [Go语言入门系列](五)之指针和结构体的使用 [Go语言入门系列](六)之再探函数 本文介绍Go语言的方法的使用. 1. ...

  5. e3mall商城的归纳总结9之activemq整合spring、redis的缓存

    敬给读者 本节主要给大家说一下activemq整合spring,该如何进行配置,上一节我们说了activemq的搭建和测试(单独测试),想看的可以点击时空隧道前去查看.讲完了之后我们还说一说在项目中使 ...

  6. Python 30道高频面试题及详细解答

    开学啦,开学啦!周末坐地铁的时候看到很多同学推着行李箱,拎着大包小包的穿梭在人群中,哎新的一学期又开始啦,同时也意味着很多同学要准备毕业啦,尤其是准大四,准研三的同学. 今年的招聘行情并不乐观,小公司 ...

  7. 当this碰到return会发生什么

    当this碰到return时 function fn(params) { this.user = 'fzy' return {} } var a = new fn console.log(a.user ...

  8. 15_Web框架-mini frame

    1.WSGI协议概述(Python Web Server Gateway Interface) 1.WSGI允许开发者将选择web框架和web服务器分开,可以混合匹配web服务器和web框架,选择一个 ...

  9. Opencv+Yolov3算法实现社交距离安全检测讲解和实战(Social Distance Detector)

    在我们进行交流谈话时,人与人之间总要保持一定的距离,尤其是在疫情的情况下,人与人之间更要保持一定的安全距离,今天给大家来介绍一个检测社交距离的项目,实现社交距离检测器. 社交距离(Social Dis ...

  10. Mybatis源码学习第八天(总结)

    源码学习到这里就要结束了; 来总结一下吧 Mybatis的总体架构 这次源码学习我们,学习了重点的模块,在这里我想说一句,源码的学习不是要所有的都学,一行一行的去学,这是错误的,我们只需要学习核心,专 ...