rabbitMQ 消息队列
2017-09-07 00:00
204 查看
异步消息学习
概念:发送者、代理者、目的地
两种形式:队列(点对点)和主题(发布/订阅式)
常用的异步消息代理有: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
概念:发送者、代理者、目的地
两种形式:队列(点对点)和主题(发布/订阅式)
常用的异步消息代理有: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
相关文章推荐
- Rabbitmq---消息队列
- RabbitMQ消息队列(二):"Hello, World"[转]
- RabbitMQ(消息队列技术,它是分布式应用间交换信息的一种技术)
- (转)RabbitMQ消息队列(三):任务分发机制
- java调用rabbitmq消息队列发送和接收消息实例
- RabbitMQ中关于消息队列的一些概念
- 消息队列Rabbitmq
- 柯南君:看大数据时代下的IT架构(5)消息队列之RabbitMQ--案例(Work Queues起航)
- aliyun 消息队列 RocketMQ、Apache RocketMQ、消息队列 Kafka、Apache Kafka、RabbitMQ 产品对比
- RabbitMq消息队列配置
- RabbitMQ消息队列+spring监听mq服务器,接收消费mq消息
- RabbitMQ服务主机名更改导致消息队列无法连接
- RabbitMQ 队列消息持久化
- 安装 RabbitMQ 消息队列
- SpringBoot的RabbitMQ消息队列: 一、消息发送接收第一印象
- 谁才是最快的消息队列:ActiveMQ, RabbitMQ[转]
- RabbitMQ消息队列(一): Detailed Introduction 详细介绍
- RabbitMQ消息队列的小伙伴(八): ProtoBuf(Google Protocol Buffer)
- 在 CentOS7 上安装 RabbitMQ 消息队列中间件
- RabbitMQ消息队列(七):适用于云计算集群的远程调用(RPC)