文档章节

rabbitMQ 消息队列

李阳-kevin
 李阳-kevin
发布于 2017/09/07 17:43
字数 1033
阅读 77
收藏 1

异步消息学习

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

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

常用的异步消息代理有: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
粉丝 4
博文 97
码字总数 42200
作品 0
西安
程序员
RabbitMQ 的安装与工作模式

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

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

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

听_风
06/07
0
0
【Python模块】rabbitMQ

RabbitMQ介绍: 父进程与子进程间,同一父继承可以用multiprocess的Manager模块来实现数据互访。 作用:RabbitMQ是为了实现相互独立的两个进程数据互访。 应用场景:不需要立即操作的数据。比...

等你的破船
08/13
0
0
RabbitMQ入门之安装配置与简单实例

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

墨鱼ID
2012/08/08
0
5
php| 初探 rabbitmq

date: 2018-09-03 21:30:23 title: php| 初探 rabbitmq description: 零零散散折腾了 rabbitmq 几次, 归纳总结一下先 经常看到消息队列( MQ ), 实战中比较少, 说说我的一些粗线的理解: 引入消...

daydaygo
09/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ArrayList嘿嘿嘿

数组扩容技术: //扩容技术 将原数组objs类容复制到新数组并且长度为11 Object[] newObjs = Arrays.copyOf(objs,11); 数组比较大那么System.arraycopy比较有优势,因为其使用的是内存复制,省...

熊猫你好
16分钟前
1
0
Android平台下的一个好用的日历库(sxtwl_cpp),支持农历转公历,和公历转农历等功能

python版的sxtwl_cpp传送入口 在build.gradle的allprojects中加入 maven { url 'https://dl.bintray.com/yuangu/sxtwl' } 最终如下面代码所示: allprojects { repositories { ......

元谷
27分钟前
9
0
Redis常用命令

keys 我把这个命令放在第一位,是因为笔者曾经做过的项目,以及一些朋友的项目,都因为使用keys这个命令,导致出现性能毛刺。这个命令的时间复杂度是O(N),而且redis又是单线程执行,在执行k...

谢思华
43分钟前
2
0
关于css宽度分离

所谓宽度分离就是width 属性不与影响宽度的 padding/border(有时候包括 margin)属性共存 例如: .box{width:200px;padding:20px;border:1px solid;} 为何要做宽度分离 一说到分离就是为了好...

莫西摩西
54分钟前
1
0
Linux常用命令

###############常用命令说明############################## cat /proc/version 显示内核的版本 mv dir1 new_dir 重命名/移动 一个目录 rm -rf a.txt b.txt c.txt 删除多个文件 chmod 777 ......

lyle_luo
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部