rabbitMQ基础篇学习
代码下载链接
http://121.37.250.237:8080/files/download?filename=mq-demo.zip
如果下载不了,进入http://121.37.250.237:8080/login,用户名root,密码123456
登录后再访问上面链接下载
1.rabbitMQ基础
rabbitMQ分为同步通信和异步通信
同步通信:比如打微信电话,对方的消息这边实时接受,只有两边都在线的情况才能通信成功
异步通信:微信发送消息,对方不在线,但是消息一直存储在rabbitMQ里,对方上线后,rabbitMQ发送消息,这种就不会存在因为对方不在线出现消息丢失的情况
2.rabbitMQ安装
我们一般都在docker里安装mq,详情见docker的rabbitMQ安装
3.rabbitMQ模式
3.1简单模式
登录rabbitMQ网页创建一个队列,创建消费者和生产者,生产者通过此队列给消费者发消息。
消费者代码:
@RabbitListener(queues ="simple.queue")publicvoidlistenSimpleQueue(String msg){System.out.println("消费者收到了simple.queue的消息:【"+ msg +"】");}
生产者代码:
@TestpublicvoidtestSendMessage2Queue(){String queueName ="simple.queue";String msg ="hello, amqp!";try{
rabbitTemplate.convertAndSend(queueName, msg);System.out.println("Message sent successfully");}catch(Exception e){
e.printStackTrace();System.out.println("Error occurred while sending message");}}
该模式下,生产者通过rabbitTemplate.convertAndSend函数,向simple.queue队列发送消息,消费者通过@RabbitListener绑定simple.queue队列,接受消息
3.2 工作模式
一个生产者,多个消费者,一个队列,生产者发送消息,所有消费者都接收到
消费者代码:
@RabbitListener(queues ="work.queue")publicvoidlistenWorkQueue1(String msg)throwsInterruptedException{System.out.println("消费者1 收到了 work.queue的消息:【"+ msg +"】");Thread.sleep(20);}@RabbitListener(queues ="work.queue")publicvoidlistenWorkQueue2(String msg)throwsInterruptedException{System.err.println("消费者2 收到了 work.queue的消息...... :【"+ msg +"】");Thread.sleep(200);}
生产者代码:
@TestvoidtestWorkQueue()throwsInterruptedException{String queueName ="work.queue";for(int i =1; i <=50; i++){String msg ="hello, worker, message_"+ i;
rabbitTemplate.convertAndSend(queueName, msg);Thread.sleep(20);}}
该模式下,生产者发送的队列,所有消费者都能接收到消息。
3.发布/订阅模式(fanout)
一个生产者、一个 fanout 类型的交换机、多个队列、多个消费者。
在网页上生成队列queue1和queue2,再生成一个fanout类型的交换机amq.fanout,用amq.fanout绑定队列queue1和queue2,此时生产者通过交换机amq.fanout发送消息,只有与amq.fanout交换机绑定的队列会接收到消息(注意消费者监听的是队列,生产者发送的是交换机)
消费者代码:
@RabbitListener(queues ="fanout.queue1")publicvoidlistenFanoutQueue1(String msg)throwsInterruptedException{System.out.println("消费者1 收到了 fanout.queue1的消息:【"+ msg +"】");}@RabbitListener(queues ="fanout.queue2")publicvoidlistenFanoutQueue2(String msg)throwsInterruptedException{System.out.println("消费者2 收到了 fanout.queue2的消息:【"+ msg +"】");}
生产者代码:
@TestvoidtestSendFanout(){String exchangeName ="amq.fanout";String msg ="hello, everyone!";
rabbitTemplate.convertAndSend(exchangeName,null, msg);}
4.路由模式(direct)
一个生产者,一个 direct 类型的交换机,多个队列。
在网页上生成队列queue1和queue2,再生成一个direct类型的交换机hmall.direct,用hmall.direct绑定队列queue1和queue2,和fanout不同的是,direct交换机可以指定一个routing-key,比如与queue1绑定的routing-key=“red”, “blue”,与queue2绑定的routing-key=“red”, “yellow”。
此时生产者通过交换机hmall.direct发送消息并带上一个routing-key,只有与hmall.direct交换机绑定的队列并且routing-key相等的才会接收到消息
消费者代码:
@RabbitListener(bindings =@QueueBinding(
value =@Queue(name ="direct.queue1", durable ="true"),
exchange =@Exchange(name ="hmall.direct", type =ExchangeTypes.DIRECT),
key ={"red","blue"}))publicvoidlistenDirectQueue1(String msg)throwsInterruptedException{System.out.println("消费者1 收到了 direct.queue1的消息:【"+ msg +"】");}@RabbitListener(bindings =@QueueBinding(
value =@Queue(name ="direct.queue2", durable ="true"),
exchange =@Exchange(name ="hmall.direct", type =ExchangeTypes.DIRECT),
key ={"red","yellow"}))publicvoidlistenDirectQueue2(String msg)throwsInterruptedException{System.out.println("消费者2 收到了 direct.queue2的消息:【"+ msg +"】");}
生产者代码:
@TestvoidtestSendDirect(){String exchangeName ="hmall.direct";String msg ="蓝色通知,警报解除,哥斯拉是放的气球";
rabbitTemplate.convertAndSend(exchangeName,"blue", msg);}
此时只有绑定的key=blue的才能收到消息,也就是消费者1,如果将生产者代码改为red,消费者1和消费者2都能收到消息。
5.主题模式(topic)
一个生产者,一个 topic 类型的交换机,多个队列,交换机与队列之间通过 routing-key 进行关联绑定,多个消费者。生产者发送消息到交换机并且要指定 routing-key,然后消息根据这交换机与队列之间的 routing-key 绑定规则进行路由被指定消费者消费。与路由模式不同是 routing-key 有指定的队则,可以更加的通用,满足更过的场景。routing-key 的规则如下:
#:匹配一个或者多个词,例如lazy.# 可以匹配 lazy.xxx 或者 lazy.xxx.xxx
:只能匹配一个词,例如lazy. 只能匹配 lazy.xxx
消费者代码:
@RabbitListener(queues ="topic.queue1")publicvoidlistenTopicQueue1(String msg)throwsInterruptedException{System.out.println("消费者1 收到了 topic.queue1的消息:【"+ msg +"】");}@RabbitListener(queues ="topic.queue2")publicvoidlistenTopicQueue2(String msg)throwsInterruptedException{System.out.println("消费者2 收到了 topic.queue2的消息:【"+ msg +"】");}
生产者代码:
@TestvoidtestSendTopic(){String exchangeName ="hmall.topic";String msg ="今天天气挺不错,我的心情的挺好的";
rabbitTemplate.convertAndSend(exchangeName,"china.weather", msg);}@TestvoidtestSendTopic1(){String exchangeName ="hmall.topic";String msg ="今天天气挺不错,我的心情的挺好的";
rabbitTemplate.convertAndSend(exchangeName,"japan.news", msg);}
版权归原作者 qq_52827180 所有, 如有侵权,请联系我们删除。