钻研一下音讯队列,当初来简略搭建一下。
1. Docker搭建RabbitMQ
1.1 查问并下载RabbitMQ镜像
docker search rabbitmq
// 抉择能够拜访web治理界面的tagdocker pull rabbitmq:management
1.2 运行RabbitMQ镜像
// 设置账号密码都为admindocker run -dit --name myrabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 rabbitmq:management
1.3 浏览器上拜访 服务器IP:15672
呈现以下页面示意启动胜利
2. 搭建SpringBoot我的项目整合RabbitMQ
2.1 pom.xml
增加web和rabbitmq的依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope></dependency><dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit-test</artifactId> <scope>test</scope></dependency>
2.2 aplication.yml
将rabbitmq的地址用户名明码等配置上
spring: rabbitmq: host: localhost port: 5672 username: admin password: admin
2.3 新建交换机SenderConfig.java
有以下三种罕用的交换机,咱们这里应用第三种
DirectExchange
直连型交换机,依据音讯携带的路由键,将音讯转发给对应的队列
FanoutExchange
扇形交换机,接管到音讯后会将音讯转发到所有队列
TopicExchange
主题交换机,依据音讯携带的路由键和交换机与队列绑定键的规定,将音讯转发给对应的队列
规定:
*(星号):示意一个字符必须呈现
#(井号):示意任意数量的字符
/** * 交换机 * @author zhouzhaodong */@Configurationpublic class SenderConfig { /** * ----- 交换机 ----- * 参数意义: * name: 名称 * durable: 长久化 * autoDelete: 主动删除 */ @Bean public TopicExchange topicExchange() { return new TopicExchange("topicExchange", true, false); } /** * ----- 队列 ----- */ @Bean public Queue queueOne() { return new Queue("queueOne", true); } @Bean public Queue queueTwo() { return new Queue("queueTwo", true); } @Bean public Queue queueThree() { return new Queue("queueThree", true); } /** * ----- 绑定 ----- * routingKey就是路由规定,音讯对应的队列,用来辨别不同的音讯队列 */ @Bean public Binding bindingFanoutOne() { return BindingBuilder.bind(queueOne()).to(topicExchange()).with("topic_one"); } @Bean public Binding bindingFanoutTwo() { return BindingBuilder.bind(queueTwo()).to(topicExchange()).with("topic_two"); } @Bean public Binding bindingFanoutThree() { return BindingBuilder.bind(queueThree()).to(topicExchange()).with("topic_one"); }}
2.4 发送者 SenderController.java
/** * 音讯发送者 * * @author zhouzhaodong */@RestControllerpublic class SenderController { @Resource AmqpTemplate amqpTemplate; Logger logger = LoggerFactory.getLogger(SenderController.class); @RequestMapping(value = "/send") public String sendMessage(String message) { logger.info("音讯发送开始工夫:" + new Date()); // 这里convertAndSend第一个参数是交换机的名称 // 第二个参数能够是routingKey // 最初一个参数就是要发送的音讯 amqpTemplate.convertAndSend("topicExchange", "topic_one", message); return "发送胜利"; }}
2.5 消费者 ReceiverController.java
/** * 消费者 * @author zhouzhaodong */@Componentpublic class ReceiverController { Logger logger = LoggerFactory.getLogger(ReceiverController.class); @RabbitHandler @RabbitListener(queues = "queueOne") public void processA(String message){ logger.info("queueOne接管音讯工夫为:" + new Date()); logger.info("queueOne接管音讯为:" + message); } @RabbitHandler @RabbitListener(queues = "queueTwo") public void processB(String message){ logger.info("queueTwo接管音讯工夫为:" + new Date()); logger.info("queueTwo接管音讯为:" + message); } @RabbitHandler @RabbitListener(queues = "queueThree") public void processC(String message){ logger.info("queueThree接管音讯工夫为:" + new Date()); logger.info("queueThree接管音讯为:" + message); }}
3. 启动我的项目进行测试
3.1 调用生产者接口
发现有两个队列收到了音讯,因为这两个队列都配置的routingKey雷同,都是topic_one
3.2 不带routingKey进行拜访
发现并没有队列收到音讯
测试完结
集体博客地址:
http://www.zhouzhaodong.xyz/
源代码地址:
https://gitee.com/zhouzhaodon...