SpringBoot集成rabbitmq(一)
前言
Rabbitmq是一个开源的消息代理软件,是AMQP协议的实现。核心作用就是创建消息队列,异步发送和接收消息。通常用来在高并发中处理削峰填谷、延迟处理、解耦系统之间的强耦合、处理秒杀订单。 入门rabbitmq之前主要是想了解下秒杀排队订单入库后,异步通知客户端秒杀结果。
基础知识
1、基本概念(角色)
了解rabbitmq之前先要了解3个基本概念:生产者、消费者、代理(队列)。 rabbitmq在生产者和代理中间做了一层抽象。这样消息生产者和队列就没有直接联系,在中间加入了一层交换器(Exchange)。这样消息生产者把消息交给交换器,交换器根据路由策略再把消息转发给对应队列。
2、消息发送原理
首先要发送消息必须先连接到rabbitmq-server。那怎么连接和发送消息呢?首先你的应用程序和rabbitmq会创建一个TCP链接。一旦TCP链接并通过认证。认证就是你试图连接rabbitmq时服务器的用户名和密码。认证通过,你的应用程序和rabbitmq之间就创建了一条AMQP信道(Channel),后续所有的消息都是基于这个信道完成。
3、为什么不直接通过TCP直接发送消息
对于操作系统来说创建和销毁TCP连接是非常昂贵的开销,而在并发高峰期时再去处理TCP创建与销毁显然是不合适的。这就造成了TCP的巨大浪费,而且操作系统每秒创建TCP的能力也是有限的,因此直接通过TCP发送消息会很快遇到瓶颈。
交换器(Exchange)
前面提到rabbitmq在你的应用程序和队列中间增加了一层代理,代理根据路由策略把消息路由到指定队列。 交换器分为4类:
- direct(默认)
- headers
- fanout
- topic
1、direct。是交换器的默认实现,根据路由规则匹配上就会把消息投递到对应队列。
2、headers。 是一个自定义匹配规则类型,在队列和交换器绑定时,会设置一组键值对,消息中也包含一组键值对,当这些键值对匹配上,则会投递消息到对应队列。
3、fanout。是一种发布订阅模式,当你发送一条消息时,交换器会把消息广播到所有附加到这个交换器的队列上。 对于fanout来说routingkey是无效的。
4、topic。可以更灵活的匹配自己想订阅的消息。也是routingkey用处最大的一种。类似我们配置request mapping中的通配符。
安装rabbitmq
我是本机ubuntu16中安装,没有配置软件源,安装速度倒还能接收。rabbitmq是erlang开发,所以先安装erlang,再安装rabbitmq-server
sudo apt-get install erlang
sudo apt-get install rabbitmq-server
安装完成后查看运行状态 systemctl status rabbitmq-server
启动 service rabbitmq-server start
停止 serivce rabbitmq-server stop
重启 service rabbitmq-server restart
安装好rabbitmq后,启用web客户端 rabbitmq-plugines enable rabbitmq_management。
启动后默认使用guest/guest访问,仅支持localhost访问: http://localhost:15672。 web站点默认端口15672。 rabbitmq默认端口5672
在SpringBoot中集成rabbitmq
1、配置信息
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
2、默认交换器(direct)实现
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; @Configuration
public class DirectConfig { @Bean
public Queue directQueue(){
return new Queue("direct",false); //队列名字,是否持久化
} @Bean
public DirectExchange directExchange(){
return new DirectExchange("direct",false,false);//交换器名称、是否持久化、是否自动删除
} @Bean
Binding binding(Queue queue, DirectExchange exchange){
return BindingBuilder.bind(queue).to(exchange).with("direct");
} }
消息生产者(发送者)
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; /**
* 消息发送--生产消息
*/
@Component
public class Sender { @Autowired
AmqpTemplate rabbitmqTemplate; public void send(String message){
System.out.println("发送消息:"+message);
rabbitmqTemplate.convertAndSend("direct",message);
}
}
消息消费者(接收者)
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component; @Component
@RabbitListener(queues = "direct")
public class Receiver { @RabbitHandler
public void handler(String message){
System.out.println("接收消息:"+message);
} }
OK,来测试下,默认情况下,只能本机访问,我本地是在ubuntu虚拟机中,我在虚拟机中运行demo
import com.zhangfei.mq.Sender;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; @Controller
@RequestMapping("/rabbitmq")
public class MyRabbitmqController { @Autowired
Sender sender; @RequestMapping("/sender")
@ResponseBody
public String sender(){
System.out.println("send string:hello world");
sender.send("hello world");
return "sending...";
}
}
运行结果
参考资料
https://www.cnblogs.com/vipstone/p/9950434.html 【推荐。作者:王磊】这里基础概念里有示意图,可以对rabbit涉及到的基础概念和流程有一个直观的认识
https://blog.csdn.net/ztx114/article/details/78410727
SpringBoot集成rabbitmq(一)的更多相关文章
- SpringBoot集成rabbitmq(二)
前言 在使用rabbitmq时,我们可以通过消息持久化来解决服务器因异常崩溃而造成的消息丢失.除此之外,我们还会遇到一个问题,当消息生产者发消息发送出去后,消息到底有没有正确到达服务器呢?如果不进行特 ...
- SpringBoot集成RabbitMQ消息队列搭建与ACK消息确认入门
1.RabbitMQ介绍 RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性.扩展性.高可用性等方面表现不俗.Rabbi ...
- springboot集成rabbitmq(实战)
RabbitMQ简介RabbitMQ使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现(AMQP的主要特征是面向消息.队列.路由.可靠性.安全).支持多种客户端,如:Python.Ru ...
- SpringBoot集成RabbitMQ
官方说明:http://www.rabbitmq.com/getstarted.html 什么是MQ? MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.MQ ...
- Java SpringBoot集成RabbitMq实战和总结
目录 交换器.队列.绑定的声明 关于消息序列化 同一个队列多消费类型 注解将消息和消息头注入消费者方法 关于消费者确认 关于发送者确认模式 消费消息.死信队列和RetryTemplate RPC模式的 ...
- SpringBoot集成RabbitMQ并实现消息确认机制
原文:https://blog.csdn.net/ctwy291314/article/details/80534604 RabbitMQ安装请参照RabbitMQ应用 不啰嗦直接上代码 目录结构如下 ...
- springboot集成rabbitmq并手动注册容器实现单个queue的ack模式
原文:https://blog.csdn.net/qq_38439885/article/details/88982373 进入正题,本文会介绍两种实现rabbitmq的ack模式的方法,分别为: 一 ...
- Springboot集成RabbitMQ之MessageConvert源码解析
问题 最近在使用RabbitMq时遇到了一个问题,明明是转换成json发送到mq中的数据,消费者接收到的却是一串数字也就是byte数组,但是使用mq可视化页面查看数据却是正常的,之前在使用过程中从未遇 ...
- SpringBoot集成RabbitMQ 从零到一,学会MQ异步和解耦--
RabbitMQ 概念 RabbitMQ 即一个消息队列,_主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用._RabbitMQ使用的是AMQP协议,它是一种二进制协议.默认启 ...
随机推荐
- Git使用的自我总结
一.Git安装后打开Git bash,第一次使用 1.Git账号信息配置 2.用命令git clone从远程库克隆 会在克隆的项目下有一个隐藏的.git目录,这个目录是Git来跟踪管理版本库的,没事千 ...
- Vue(三十)公共组件
以 分页 组件为例:(根据自己具体业务编写) 1.pagination.vue <template> <!-- 分页 --> <div class="table ...
- Mac_Sublime Text3(mac)一些插件和快捷键
下载地址http://www.sublimetext.com/3 一.安装Package Control 按Ctrl + ` 调出console,粘贴下列安装代码到底部命令行并回车: import u ...
- 201771010126 王燕《面向对象程序设计(java)》第十一周学习总结
实验十一 集合 实验时间 2018-11-8 1.实验目的与要求 (1) 掌握Vetor.Stack.Hashtable三个类的用途及常用API: Vector类实现了长度可变的数组. Vecto ...
- mysql5.7忽略大小写问题
mysql5.7忽略大小写问题 1.1 前言 新安装mysql5.7版本后,linux环境下默认是大小写敏感的. 1.2 忽略大小写敏感步骤 进入mysql配置文件: vi /et ...
- [Swift]LeetCode298. 二叉树最长连续序列 $ Binary Tree Longest Consecutive Sequence
Given a binary tree, find the length of the longest consecutive sequence path. The path refers to an ...
- [Swift]LeetCode347. 前K个高频元素 | Top K Frequent Elements
Given a non-empty array of integers, return the k most frequent elements. Example 1: Input: nums = [ ...
- [Swift]LeetCode833. 字符串中的查找与替换 | Find And Replace in String
To some string S, we will perform some replacement operations that replace groups of letters with ne ...
- MySql综合知识汇总
本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB Mysql驱动:com.mysql.jdbc.Driver MysqlURL:jdbc:mysql://loca ...
- 机器学习基石笔记:04 Feasibility of Learning
原文地址:https://www.jianshu.com/p/f2f4d509060e 机器学习是设计算法\(A\),在假设集合\(H\)里,根据给定数据集\(D\),选出与实际模式\(f\)最为相近 ...