rabbitMQ 消息队列
rabbitMQ 消息队列
李阳-kevin 发表于8个月前
rabbitMQ 消息队列
  • 发表于 8个月前
  • 阅读 29
  • 收藏 1
  • 点赞 0
  • 评论 0

【腾讯云】新注册用户域名抢购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

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 2
博文 78
码字总数 35000
×
李阳-kevin
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: