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协议,它是一种二进制协议.默认启 ...
随机推荐
- js array 对象
Javascript 对象: Array 对象:数组 创建方法: 1, var a = new Array() 2,var a = new Array(3) 3,var a = new Array(“ ...
- cnn神经网络入门
1.神经网络最基本的原理也是函数拟合,所以lose function就显得非常重要了,我们训练的目的之一就是减小损失函数,常用的损失函数参考:https://www.cnblogs.com/hypnu ...
- 用Group by分组后,取每组的前3条记录,怎么取?
使用子查询进行查询 SELECT * FROM home_content a WHERE ( SELECT count(id) FROM home_content WHERE class_link = ...
- [LeetCode] Lemonade Change 买柠檬找零
At a lemonade stand, each lemonade costs $5. Customers are standing in a queue to buy from you, and ...
- HTTP Status 500 - Request processing failed; nested exception is org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
今天整合ssm框架 时 遇到的问题 困扰我好长时间 原因就是 mapper文件 没有被加载进来 但是 为什么没有被加载进来呢 因为中间的配置文件出了一些问题 网上大多数说法是 在pom ...
- swust oj 1052
输出利用先序遍历创建的二叉树中的指定结点的双亲结点 1000(ms) 10000(kb) 2415 / 5575 利用先序递归遍历算法创建二叉树并输出该二叉树中指定结点的双亲结点.约定二叉树结点数据为 ...
- jQuery ajax如何传多个值到后台页面,举例:
一.js代码 <script type="text/JavaScript">$("#save_change_<{$aff.Id}>"). ...
- [Swift]LeetCode20. 有效的括号 | Valid Parentheses
Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...
- [Swift]LeetCode28. 实现strStr() | Implement strStr()
Implement strStr(). Return the index of the first occurrence of needle in haystack, or -1 if needle ...
- [Swift]LeetCode320. 通用简写 $ Generalized Abbreviation
Write a function to generate the generalized abbreviations of a word. Example: Given word = "wo ...