RabbitMQ是实现了高级消息队列协议(Advanced Message Queueing Protocol , AMQP)的开源消息代理软件(亦称面向消息的中间件)。

1、AMQP协议

  RocketMQ基于JMS(Java Messaging Service , java 消息服务)协议。

  重点:协议的作用:两者的交互基础。

  三个主要的功能模块:

    1.1、“exchange”接收发布应用程序发送的消息,并根据一定的规则将这些消息路由到“消息队列”。(交换器类型:direct, fanout, topic, header)

    1.2、“message queue”存储消息,直到这些消息被消费者安全处理完为止。

    1.3、“binding”定义了exchange和message queue之间的关联,提供路由规则。

  AMQP协议是一个二进制协议。

  协议模型图:

  

2、RabbitMQ

  2.1、交换器类型:

    2.1.1、direct (默认):每个队列都会使用它的队列名字作为路由关键字(routing key)去自动地绑定到默认交换器上。

    2.1.2、fanout : 该类型的交换器会将消息转发给所有与之绑定的队列上。(类似广播机制)

    2.1.3、topic : 该类型的交换器会视消息路由关键字和绑定路由关键字之间的匹配情况,进行消息的路由转发。解析:一个消息过来后,将根据路由key转发给符合要求的所有队列。

    2.1.4、headers : 用于路由的属性是取自于消息header属性的,当消息header的值与队列绑定时指定的值相同时,消息就会路由至相应的队列中。

  2.2、虚拟机(virtual hosts)

    AMQP使用了虚拟机的概念,在一个broker上面划分出多个隔离的环境(各环境下的用户、交换器以及队列等互不影响)。这样一来,AMQP客户端们在进行连接的时候,需要协商指定同一个vhost才能进行正常的往来业务。

3、spring-boot-starter-amqp 的使用

  1、BeanConfig

@Configuration
public class AmqpConfig { @Resource
private RabbitTemplate rabbitTemplate; @Bean
public AmqpTemplate amqpTemplate() {
Logger log = LoggerFactory.getLogger(RabbitTemplate.class);
rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
rabbitTemplate.setEncoding("UTF-8");
rabbitTemplate.setMandatory(true);
rabbitTemplate.setUsePublisherConnection(true);
rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {
if (ack) {
log.info("消息发送到exchange成功,id: {}", correlationData.getId());
} else {
log.info("消息发送到exchange失败,原因: {}", cause);
}
});
rabbitTemplate.setReturnCallback((message, replyCode, replyText, exchange, routingKey) -> {
String correlationId = message.getMessageProperties().getCorrelationId();
log.info("消息:{} 发送失败, 应答码:{} 原因:{} 交换机: {} 路由键: {}", correlationId, replyCode, replyText, exchange, routingKey);
});
return rabbitTemplate;
} /**
* 修改好友备注交换机
*/
@Bean(AmqpConstant.MODIFY_FRIEND_REMAKE_NAME_DIRECT_EXCHANGE)
public Exchange modifyFriendRemakeNameDirectExchange() {
return ExchangeBuilder
.directExchange(AmqpConstant.MODIFY_FRIEND_REMAKE_NAME_DIRECT_EXCHANGE)
.durable(true)
.build();
} /**
* 队列
*/
@Bean(AmqpConstant.MODIFY_FRIEND_REMAKE_NAME_QUEUE)
public Queue modifyFriendRemakeNameQueue() {
return QueueBuilder.durable(AmqpConstant.MODIFY_FRIEND_REMAKE_NAME_QUEUE).build();
} /**
* 队列 关联 路由key 关联 交换机
* @return
*/
@Bean
public Binding modifyFriendRemakeNameBinding(Queue modifyFriendRemakeNameQueue, Exchange modifyFriendRemakeNameDirectExchange) {
return BindingBuilder
.bind(modifyFriendRemakeNameQueue)
.to(modifyFriendRemakeNameDirectExchange)
.with(AmqpConstant.MODIFY_FRIEND_REMAKE_NAME_ROUTING_KEY)
.noargs();
} }

  2、AmqpConstant

public interface AmqpConstant {

    /**
* 修改好友备注交换机
*/
String MODIFY_FRIEND_REMAKE_NAME_DIRECT_EXCHANGE = "modifyFriendRemakeNameDirectExchange"; /**
* 修改好友备注队列
*/
String MODIFY_FRIEND_REMAKE_NAME_QUEUE = "modifyFriendRemakeNameQueue"; /**
* 修改好友备注路由键
*/
String MODIFY_FRIEND_REMAKE_NAME_ROUTING_KEY = "modifyFriendRemakeNameRoutingKey"; }

 3、RabbitUtils

public class RabbitUtils {

    private static final Logger logger = LoggerFactory.getLogger(RabbitUtils.class);

    public static void sendModifyRemakeNameMsg(RabbitTemplate rabbitTemplate, RabbitFriend rabbitFriend){
try{
if(rabbitFriend.getLists().size() < 1){
return;
}
logger.info("sendModifyRemakeNameMsg request:"+JSON.toJSONString(rabbitFriend));
CorrelationData correlationDataId = new CorrelationData(UUID.randomUUID().toString());
rabbitTemplate.convertAndSend(
AmqpConstant.MODIFY_FRIEND_REMAKE_NAME_DIRECT_EXCHANGE,
AmqpConstant.MODIFY_FRIEND_REMAKE_NAME_ROUTING_KEY,
rabbitFriend,
correlationDataId
);
}catch (Exception e){
logger.info("mq消息发送错误",e);
}
}
}

  4、生产者

@RunWith(SpringRunner.class)
@SpringBootTest
public class RabbitTest { @Autowired
RabbitTemplate rabbitTemplate; @Test
public void test1(){ RabbitFriend rabbitFriend = new RabbitFriend();
rabbitFriend.setUserId(100000022);
rabbitFriend.setLists(new ArrayList<>());
rabbitFriend.getLists().add(new RabbitNickName("2637845647931","2637845647931123哈哈"));
rabbitFriend.getLists().add(new RabbitNickName("2637","2637哈哈")); RabbitUtils.sendModifyRemakeNameMsg(rabbitTemplate,rabbitFriend); try {
int read = System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("end!");
}
}

  5、消费者

@Component
public class RemakeNameMessageListener { private static final Logger log = LoggerFactory.getLogger(RemakeNameMessageListener.class); @RabbitListener(queues = AmqpConstant.MODIFY_FRIEND_REMAKE_NAME_QUEUE)
public void remakeNameQueueListener(Message message, Channel channel) throws IOException {
try {
RabbitFriend rabbitFriend = RabbitUtils.buildMessage(message, RabbitFriend.class);
log.info("RemakeNameMessageListener|remakeNameQueueListener,correlationDataId:{},RabbitFriend:{}", message.getMessageProperties().getCorrelationId(), rabbitFriend); //do you things log.info("RemakeNameMessageListener|remakeNameQueueListener,Consumption of success");
channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
} catch (Exception e) {
log.error("RemakeNameMessageListener|remakeNameQueueListener,Consumption of failed,cause:{}", e.getMessage());
channel.basicNack(message.getMessageProperties().getDeliveryTag(), true, true);
}
} }

  6、springboot 配置文件

spring:
rabbitmq:
host: 192.168.4.21
port: 5672
username: sasa
password: sasa
publisher-confirms: true #手动确认
publisher-returns: true
virtualHost: / #虚拟机路径
template:
mandatory: true
retry:
enabled: true #重试
multiplier: 2 #重试次数

RabbitMq 概述的更多相关文章

  1. Spring RabbitMq概述

    Spring AMQP consists of a handful of modules, each represented by a JAR in the distribution. These m ...

  2. 简单易用的.NET免费开源RabbitMQ操作组件EasyNetQ解析

    对于目前大多的.NET项目,其实使用的技术栈都是差不多,估计现在很少用控件开发项目的了,毕竟一大堆问题.对.NET的项目,目前比较适合的架构ASP.NET MVC,ASP.NET WebAPI,ORM ...

  3. 了解一下RabbitMQ

    RabbitMQ概述 RabbitMQ是遵从AMQP协议的 通信协议都设计到报文交互,换句话说RabbitMQ就是AMQP协议的Erlang的实现. AMQP说到底还是一个通信协议从low-level ...

  4. 开源RabbitMQ操作组件

    开源RabbitMQ操作组件 对于目前大多的.NET项目,其实使用的技术栈都是差不多,估计现在很少用控件开发项目的了,毕竟一大堆问题.对.NET的项目,目前比较适合的架构ASP.NET MVC,ASP ...

  5. Windows 安装 RabbitMQ

    RabbitMQ概述 RabbitMQ是流行的开源消息队列系统,是AMQP(Advanced Message Queuing Protocol高级消息队列协议)的标准实现,用erlang语言开发.Ra ...

  6. rabbitMQ消息队列原理

    MQ:Message Queue,消息队列,是一种应用程序对应用程序的通信方法:应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们. 1      rabbitMQ入 ...

  7. 中间件系列一 RabbitMQ之安装和Hello World Demo

    https://blog.csdn.net/hry2015/article/details/79016854 1. 概述 RabbitMQ是一个由erlang开发的AMQP(Advanced Mess ...

  8. RabbitMQ 安装与界面管理

    RabbitMQ 安装与界面管理 RabbitMQ概述 官网:https://www.rabbitmq.com/ RabbitMQ是部署最广泛的开源消息代理. RabbitMQ拥有成千上万的用户,是最 ...

  9. Python自学day-11

    一.RabbitMQ概述 RabbitMQ是一种消息队列,是一个公共的消息中间件,用于不同进程之间的通讯. 除了RabbitMQ以外,还有ZeroMQ.ActiveMQ等等. 前面学习了两种队列: 线 ...

随机推荐

  1. JAVA基础--MySQL(二)

     数据库约束 1.基础限制 ① 单一表内字节量总和不能超过65535,null 占用一个字节空间 ② varchar存储255 以内字节占用一个字节表示长度,255以上自己则占用两个字节表示长度 ③ ...

  2. 【JZOJ6246】【20190627】B

    题目 求逆续对个数为\(k\)的\(n\)阶排列个数\(mod \ 1e9+7\) $1 \le n  ,  k \le 10^5 $ 题解 $f_{i,j} = \sum_{k=0}^{i-1} f ...

  3. javascript优先级注意点

    javascript 优先级 注意一下 && 和 == 号之间的优先级关系 请首先看如下代码, 判断下 && 和 == 的优先级 const emptyObj = {n ...

  4. 洛谷P5171 Earthquake

    题面 题解 我们先把样例画出来: 看到它是一个减函数感觉很烦,考虑把函数转过来一下: 转过来的函数通过推导可得为: \[ y = \frac abx + \frac {c \bmod a}b \] 于 ...

  5. css选择指定元素

    .butSpan:){ margin-left: 10px; } nth-child(n+2)括号内可以是公式 可是是数字

  6. OpenGL的核心模式与立即渲染模式

    早期的OpenGL使用立即渲染模式(Immediate mode,也就是固定渲染管线),这个模式下绘制图形很方便.OpenGL的大多数功能都被库隐藏起来,开发者很少能控制OpenGL如何进行计算的自由 ...

  7. kubernetes篇 容器用户权限控制

    问题起源 问题起源于一个开发BUG:正常运行一段时间的POD,突然有一天运行报错了,错误是没有操作目录的权限,查其原因,原来是镜像被更新了,镜像添加了操作用户,而被操作的目录(NFS目录)并不具备普通 ...

  8. Ajax验证

    import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactor ...

  9. 研发团队是该制定OKR还是KPI?

    绩效管理和OKR的目标管理,是前行的两条腿,缺谁都会寸步难行.正确的做法是把企业的使命和任务,转化为经营目标,然后再用KPI.OKR等绩效管理工具,分解.执行.考核.. KPI是一套绩效管理的方法.全 ...

  10. PMP 第12~13章错题总结

    1.合同解释应该遵循几个主要原则: 1)主导语言原则 2)适用法律原则 3)整体解释原则 4)公平诚信原则2.合同收尾包括的工作: 1)产品核实 2)可交付成果验收 3)财务结算 4)退还保证金或担保 ...