文档章节

rabbitMQ 消息队列

李阳-kevin
 李阳-kevin
发布于 2017/09/07 17:43
字数 1033
阅读 51
收藏 1
点赞 0
评论 0

异步消息学习

概念:发送者、代理者、目的地

两种形式:队列(点对点)和主题(发布/订阅式)

常用的异步消息代理有:JMS和 AMQP

amqp的主要实现有RabbitMQ

下面主要讲讲RabbitMQ:

 

1.安装本地RabbitMQ,

下载安装erlang,下载地址:http://www.erlang.org/downloads

下载安装rabbitmq,地址:http://www.rabbitmq.com/download.html

可参考:https://my.oschina.net/jiboping/blog/795945

springboot项目默认rabbit主机为localhost,端口为:5672,所以无需在application.properties中进行配置。

 

2.消息及目的地的定义(程序启动时调用)

队列:springboot入口类实现CommandLineRunner接口并定义一个rabbitTemplate属性进行对象注入,使用@Bean注解定义目的地,及队列的方法。

消息:重写run方法,方法体中指定消息队列和要发送的消息。

 

3.消息监听

使用@Component定义接受类,在接受类中使用RabbitListener(queues=“2中定义的队列名”)定义接受方法,形参为接受到的消息

 

4.交换机

directExchange:直接路由。系统会默认创建一个路由,不需要进行路由和队列的绑定,发送消息时只需要指定队列(在此,队列名相当于路由键),该路由即可接受发送的消息,队列不存在时,消息被丢弃。

 

fanoutExchange:需要创建fanoutExchange交换机,并将交换和路由进行绑定,发送消息时需要指定交换机,不需要指定队列。跟交换机绑定的的每一个队列都会接受到发送的消息;队列和交换机时多对多的关系,不需要路由键,交换机不存在或交换价没有绑定队列时,消息被丢弃。

 

topicExchange创建交换机,队列,绑定交换机和队列并关注指定的主题,发送消息时需要指定交换机,主题(在此,主题就是路由键),交换机绑定的关注该主题的队列都会收到消息。

主题可由多个关键字组成,用“.”隔开,长度不能超过255 bytes,即127个字母或64个汉字;

“*”可以匹配一个关键字,“#”可以匹配任意多个关键字;

每个主题只会匹配一次或者可理解为:即使发送消息的主题有多个关键字匹配同一个绑定的主题,消费者也只会消费一次;

比如我们绑定 “*.b.*”, "*.*.c", 和 "a.#"三个主题,发送主题消息的匹配情况如下:

发送主题 匹配的情况

a.b.c.d 匹配最后一个

a.d 匹配最后一个

a 匹配最后一个

a.b 匹配最后一个

a.b.c 匹配所有

a.d.c 匹配最有两个

a.b.e 匹配第一个和第三个

f.b.c 匹配前两个

e.f.c.d 无匹配

匹配第一个规则:必须有且只有三个关键字,而且中间关键字是“b”;

匹配第二个规则:必须有且只有三个关键字,而且第三个关键字是“c”;

匹配第三个规则:至少一个关键字,而且第一个关键字是“a”;

 

中文文档:http://rabbitmq.mr-ping.com/

官方示例:http://projects.spring.io/spring-amqp/

 

 

常见异常分析:

1、如果写错了host (如:factory.setHost("locathost"); )报错:

Exception in thread "main" Java.NET.UnknownHostException: locathost

at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:195)

at java.Net.SocksSocketImpl.connect(SocksSocketImpl.java:366)

at java.net.Socket.connect(Socket.java:529)

at com.rabbitmq.client.impl.FrameHandlerFactory.create(FrameHandlerFactory.java:32)

at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:588)

at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:612)

at com.aaa.test.Send.main(Send.java:19)

 

2、如果写错了HOST的IP(如:factory.setHost("192.168.1.10"); )无此地址, 报错:

Exception in thread "main" java.net.ConnectException: Connection timed out: connect

at java.net.PlainSocketImpl.socketConnect(Native Method)

at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)

at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)

at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)

at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)

at java.net.Socket.connect(Socket.java:529)

at com.rabbitmq.client.impl.FrameHandlerFactory.create(FrameHandlerFactory.java:32)

at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:588)

at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:612)

at com.aaatest.Send.main(Send.java:19)

 

3、如果写错端口PORT(如:factory.setPort(5678);) 报错:

Exception in thread "main" java.net.ConnectException: Connection refused: connect

at java.net.PlainSocketImpl.socketConnect(Native Method)

at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)

at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)

at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)

at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)

at java.net.Socket.connect(Socket.java:529)

at com.rabbitmq.client.impl.FrameHandlerFactory.create(FrameHandlerFactory.java:32)

at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:588)

at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:612)

at com.aaa.test.Send.main(Send.java:19)

 

4、如果写错用户名或者密码,报错:

Exception in thread "main" com.rabbitmq.client.AuthenticationFailureException: ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broker logfile.

at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:338)

at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:590)

at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:612)

at com.aaa.test.Send.main(Send.java:19)

 

示例代码见:https://git.oschina.net/chinakevinos/rabbitmq_demo.git

© 著作权归作者所有

共有 人打赏支持
李阳-kevin
粉丝 3
博文 82
码字总数 35576
作品 0
西安
程序员
RabbitMQ 的安装与工作模式

RabbitMQ 概念: 交换机(exchange type)把消息推送到队列的方法: fanout:不处理路由键,转发到所有绑定的队列上 direct:处理路由键,必须完全匹配,即路由键字符串相同才会转发 topic:路由...

求学ing
2014/11/11
0
0
Spring Boot+RabbitMQ学习笔记

RabbitMQ RabbitMQ 是一个由 Erlang 语言开发的 的开源实现。最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。 消息队列 先从基础开始,加...

听_风
06/07
0
0
RabbitMQ入门之安装配置与简单实例

简介 由于某些原因,今天接触了一下一个新的东西RabbitMQ( http://www.rabbitmq.com/)总的来说给人的感觉就是安装简单方便,同时功能强大。而且官网也给出了几个相当实用的例子,不管关于消...

墨鱼ID
2012/08/08
0
5
消息中间件—RabbitMQ(集群监控篇1)

摘要:任何没有监控的系统上线,一旦在生产环境发生故障,那么排查和修复问题的及时性将无法得到保证 一、为何要对消息中间件进行监控? 上线的业务系统需要监控,然而诸如消息队列、数据库、...

癫狂侠
05/28
0
0
RabbitMQ erlang "hello world"

官方文档:http://www.rabbitmq.com/tutorials/tutorial-one-python.html 下文为翻译和erlang客户端的例子 RabbitMQ是一个消息中间件,它主要的思想非常简单:接收和发送消息。你可以把Rabbi...

nao
2015/07/24
0
0
深入理解消息中间件技术之RabbitMQ服务

什么叫消息队列? 消息(Message)是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。消息队列(Message Queue)是一种应用间的通信方式,...

掘金官方
07/12
0
0
RabbitMQ与Redis做队列比较

本文仅针对RabbitMQ与Redis做队列应用时的情况进行对比 具体采用什么方式实现,还需要取决于系统的实际需求 简要介绍 RabbitMQ RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,...

Edwyn王
2015/05/20
0
0
消息中间件—RabbitMQ(初探篇)

文章摘要:本篇文章为RabbitMQ的入门文章,不像其他一些程序代码和应用实战性的文章会带着大家从一个“Hello World”的简单例子出发,在该篇幅中主要给大家讲下RabbitMQ消息队列的起源、为何...

癫狂侠
05/23
0
0
架构设计之NodeJS操作消息队列RabbitMQ

一. 什么是消息队列? 消息(Message)是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。 消息队列(Message Queue)是一种应用间的通信方...

07/13
0
0
RabbitMQ消息中间件介绍

一、基础介绍 随着分布式应用的发展消息队列中间件成为C/S架构中解耦的一个重要环节,传统的消息传输模型中,C端发出消息,S端必须在线,否则将无法继续进行,而在拥有消息中间件的模型下消息...

qiao645
06/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Git GUI Client

Git GUI Client   这里我们为大家收藏了众多Git的GUI客户端,下载请点击这里

qwfys
8分钟前
0
0
SpringBoot | 第九章:Mybatis-plus的集成和使用

前言 本章节开始介绍数据访问方面的相关知识点。对于后端开发者而言,和数据库打交道是每天都在进行的,所以一个好用的ORM框架是很有必要的。目前,绝大部分公司都选择MyBatis框架作为底层数...

oKong
12分钟前
2
0
win10 上安装解压版mysql

1.效果 2. 下载MySQL 压缩版 下载地址: https://downloads.mysql.com/archives/community/ 3. 配置 3.1 将下载的文件解压到合适的位置 我最终将myql文件 放在:D:\develop\mysql 最终放的位...

Lucky_Me
18分钟前
1
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

问题终结者
33分钟前
1
0
expect脚本同步文件expect脚本指定host和要同步的文件 构建文件分发系统批量远程执行命令

expect脚本同步文件 在一台机器上把文件同步到多台机器上 自动同步文件 #!/usr/bin/expectset passwd "123456"spawn rsync -av root@192.168.133.132:/tmp/12.txt /tmp/expect {"yes...

lyy549745
33分钟前
0
0
36.rsync下 日志 screen

10.32/10.33 rsync通过服务同步 10.34 linux系统日志 10.35 screen工具 10.32/10.33 rsync通过服务同步: rsync还可以通过服务的方式同步。那需要开启一个服务,他的架构是cs架构,客户端服务...

王鑫linux
41分钟前
0
0
matplotlib 保存图片时的参数

简单绘图 import matplotlib.pyplot as pltplt.plot(range(10)) 保存为csv格式,放大后依然很清晰 plt.savefig('t1.svg') 普通保存放大后会有点模糊文件大小20多k plt.savefig('t5.p...

阿豪boy
46分钟前
1
0
java 8 复合Lambda 表达式

comparator 比较器复合 //排序Comparator.comparing(Apple::getWeight);List<Apple> list = Stream.of(new Apple(1, "a"), new Apple(2, "b"), new Apple(3, "c")) .collect(......

Canaan_
昨天
0
0
nginx负载均衡

一、nginx 负载均衡 拓扑图: 主机信息: 1、负载均衡器1(lb1):192.168.10.205 RHEL7.5 2、负载均衡器2(lb2):192.168.10.206 RHEL7.5 3、web服务器1(web01):192.168.10.207 Centos...

人在艹木中
昨天
0
0
做了一个小网站

做了一个小网站 www.kanxs123.com

叶落花开
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部