简介:
rabbitMQ是一个消息服务的具体实现,那么什么是消息服务?
消息服务就是两个程序时间进行通讯的标准。这里我介绍两种消息服务。一种是JMS(Java Message Service)java消息服务,通过统一的java API层面的标准,使得多个消息客户端通过JMS进行交互。另一种是AMQP(Advanced Message Queueing Protocol)高级消息队列,是协议层面的规范,因此是可以跨平台的。
ActiveMQ是基于JMS标准实现的(两种消息发布模型:点对点和发布者订阅者模式),RabbitMQ是基于AMQP实现的,他们也称消息队列,是进程或线程之间的一种异步通信的方式。如果使用消息队列的话,消息生产者会将消息保存到消息队列里面,直到消费者消费。生产者和消费者不需要同时和消息队列交互。实现了解耦,提高系统的可靠性和可扩展性。
应用场景:
基础概念:
代码实现direct类型的Exchange路由规则:
一:创建Spring Boot项目,勾选rabbitMQ依赖,配置Rabbitmq的连接信息
spring.rabbitmq.host=localhost spring.rabbitmq.username=guest spring.rabbitmq.password=guest spring.rabbitmq.port=5672
二:创建dierct配置类:
package com.zl.rabbitmq.config; import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.BindingBuilder; import org.springframework.amqp.core.DirectExchange; import org.springframework.amqp.core.Queue; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class rabbitDirectConfig { //ctrl+shift+u=小写替换成大写 private final static String DIRECTNAME="zl"; //队列 @Bean Queue queue() { return new Queue("hello ,zl"); } @Bean DirectExchange directExchange(){ //重启后是否有效 //长期未使用是否删除 return new DirectExchange(DIRECTNAME,true,false); } //将队列和DirectExchange绑定到一起 Binding binding(){ return BindingBuilder.bind(queue()).to(directExchange()).with("direct"); } }
三:创建消费者:
package com.zl.rabbitmq.receiver; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; //消费者 @Component public class DirecReceiver { @RabbitListener(queues = "hello ,zl") public void handler(String msg){ System.out.println("handler"+msg); } }
四:发送消息:
package com.zl.rabbitmq; import org.junit.jupiter.api.Test; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class RabbitmqApplicationTests { @Autowired RabbitTemplate rabbitTemplate; @Test void contextLoads() { rabbitTemplate.convertAndSend("hello ,zl","hello zll"); } }
五:测试:
2020-04-11 12:14:05.442 INFO 32 --- [ main] o.s.a.r.c.CachingConnectionFactory : Attempting to connect to: [localhost:5672] 2020-04-11 12:14:05.474 INFO 32 --- [ main] o.s.a.r.c.CachingConnectionFactory : Created new connection: rabbitConnectionFactory#4e558728:0/SimpleConnection@43effd89 [delegate=amqp://guest@127.0.0.1:5672/, localPort= 50208] 2020-04-11 12:14:05.567 INFO 32 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ‘‘ 2020-04-11 12:14:05.621 INFO 32 --- [ main] com.zl.rabbitmq.RabbitmqApplication : Started RabbitmqApplication in 3.968 seconds (JVM running for 12.158) handlerhello zll
流程:当消息到达DirectExchange的时候,会被转发到和该条消息的routing key相同的队列中去。
消息发送者发送一条"hello zll"的消息,并指定rountingkey为"hello ,zl"。然后消息到达DirectExchange中,由binding将Exchange和队列绑定在一起,将这个消息转发到和该条消息的routing key相同的队列中。然后消费者监听这个routing key的队列。当有消息时,就打印出来。
原文:https://www.cnblogs.com/javazl/p/12678030.html