您的位置:首页 > 其它

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息