RabbitMQ的使用Demo
rabbitmq消息队列,官网有六种,实战常用的也就如下五种。
下面开始demo讲解
大致三步:1.配置消息队列,2.生产者提供消息给队列,3.消费者监听消费队列消息
源码下载:https://pan.baidu.com/s/119Hf0YFrWiQK9m4hwVrKPQ
1.配置消息队列
package com.qy.mq.provider; import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; /**
* @author 七脉
* 描述:这里主要讲解五种队列消息
* 1.一对一普通队列(hello world)
* 2.一对多工作队列
* 3.fanout广播队列(发布订阅)
* 4.direct定向队列(routing-key)
* 5.topic通配符队列(*、#)
*/
@Configuration
public class RabbitmqConfig { /**hello world普通队列**/
public static final String HELLO_WORLD_QUEUE = "hello_world_queue"; /**work工作队列**/
public static final String WORK_QUEUE = "work_queue"; /**fanout使用队列 one**/
public static final String FANOUT_QUEUE_ONE = "fanout_queue_one"; /**fanout使用队列 two**/
public static final String FANOUT_QUEUE_TWO = "fanout_queue_two"; /**direct routing使用队列ONE**/
public static final String DIRECT_QUEUE_ONE = "direct_queue_one"; /**direct routing使用队列TWO**/
public static final String DIRECT_QUEUE_TWO = "direct_queue_two"; /**topic使用队列**/
public static final String TOPIC_QUEUE_ONE = "topic_queue_one"; /**topic使用队列**/
public static final String TOPIC_QUEUE_TWO = "topic_queue_TWO"; /**fanout交换机**/
public static final String FANOUT_EXCHANGE = "fanout_exchange"; /**direct routing交换机**/
public static final String DIRECT_EXCHANGE = "direct_exchange"; /**topic交换机**/
public static final String TOPIC_EXCHANGE = "topic_exchange"; /**定义routing-key提供给direct交换机使用**/
public static final String ROUTING_KEY = "my_routing_key"; /**定义topic通配符提供给topic交换机使用**/
public static final String TOPICS_ONE = "my_topic.*";//*表示匹配任何一个单词
/**定义topic通配符提供给topic交换机使用**/
public static final String TOPICS_MORE = "my_topic.#";//#表示匹配任何多个单词 /**
* @author 七脉
* 描述:hello world普通队列,不需要绑定交换机
* 官方文档里,点对点, 一个生产者、一个队列、一个消费者。
* @return
*/
@Bean
public Queue helloWorldQueue(){
return new Queue(HELLO_WORLD_QUEUE, true, false, false);
//return new Queue(HELLO_WORLD_QUEUE, true);
} /**
* @author 七脉
* 描述:work工作队列,不需要绑定交换机
* 官方文档里, 一个生产者、一个队列、多个消费者。
* 多个消费者时,会均分接收消息。
* @return
*/
@Bean
public Queue workQueue(){
return new Queue(WORK_QUEUE, true);
} /**
* @author 七脉
* 描述:第一个fanout广播队列,需要绑定Fanout交换机
* fanout交换机会把消息发送到每一个绑定的队列
* 官方:发布订阅
* @return
*/
@Bean
public Queue fanoutQueueOne(){
return new Queue(FANOUT_QUEUE_ONE, true);
} /**
* @author 七脉
* 描述:第二个fanout广播队列,需要绑定Fanout交换机
* fanout交换机会把消息发送到每一个绑定的队列
* 官方:发布订阅
* @return
*/
@Bean
public Queue fanoutQueueTwo(){
return new Queue(FANOUT_QUEUE_TWO, true);
} /**
* @author 七脉
* 描述:第一个direct定向队列,需要绑定Direct交换机,并指定routing-key
* direct交换机会把消息发送到每一个绑定且指定相同routing-key的队列,
* 官方:Routing
* @return
*/
@Bean
public Queue directQueueOne(){
return new Queue(DIRECT_QUEUE_ONE, true);
} /**
* @author 七脉
* 描述:第二个direct定向队列,需要绑定Direct交换机,并指定routing-key
* direct交换机会把消息发送到每一个绑定且指定相同routing-key的队列,
* 官方:Routing
* @return
*/
@Bean
public Queue directQueueTwo(){
return new Queue(DIRECT_QUEUE_TWO, true);
} /**
* @author 七脉
* 描述:第一个topic通配符匹配队列,需要绑定Topic交换机
* topic队列使用*、#的通配符进行匹配topic交换机的消息
* 官方:Topics
* @return
*/
@Bean
public Queue topicQueueOne(){
return new Queue(TOPIC_QUEUE_ONE, true);
} /**
* @author 七脉
* 描述:第二个topic通配符匹配队列,需要绑定Topic交换机
* topic队列使用*、#的通配符进行匹配topic交换机的消息
* 官方:Topics
* @return
*/
@Bean
public Queue topicQueueTwo(){
return new Queue(TOPIC_QUEUE_TWO, true);
} /**
* @author 七脉
* 描述:定义 FanoutExchange 交换机
* FanoutExchange交换机,将消息发送到每一个绑定的消息队列中
* @return
*/
@Bean
public FanoutExchange fanoutExchange(){
return new FanoutExchange(FANOUT_EXCHANGE, true, true);
} /**
* @author 七脉
* 描述:定义 DirectExchange 交换机
* DirectExchange交换机,将消息发送到每一个绑定且对应routing-key的队列中
* @return
*/
@Bean
public DirectExchange directExchange(){
return new DirectExchange(DIRECT_EXCHANGE, true, true);
} /**
* @author 七脉
* 描述:定义 TopicExchange 交换机
* TopicExchange交换机,将消息发送到每一个绑定且匹配topic通配符的队列中
* @return
*/
@Bean
public TopicExchange topicExchange(){
return new TopicExchange(TOPIC_EXCHANGE, true, true);
} /**
* @author 七脉
* 描述:将第一个FanoutQueueOne队列绑定到FanoutExchange交换机
* @param fanoutQueueOne
* @param fanoutExchange
* @return
*/
@Bean
public Binding bindingFanoutQueueOne(Queue fanoutQueueOne, FanoutExchange fanoutExchange){
return BindingBuilder.bind(fanoutQueueOne).to(fanoutExchange);
} /**
* @author 七脉
* 描述:将第二个FanoutQueueTwo队列绑定到FanoutExchange交换机
* @param fanoutQueueOne
* @param fanoutExchange
* @return
*/
@Bean
public Binding bindingFanoutQueueTwo(Queue fanoutQueueTwo, FanoutExchange fanoutExchange){
return BindingBuilder.bind(fanoutQueueTwo).to(fanoutExchange);
} /**
* @author 七脉
* 描述:将第一个DirectQueueOne队列绑定到DirectExchange交换机
* @param directQueueOne
* @param directExchange
* @return
*/
@Bean
public Binding bindingDirectQueueOne(Queue directQueueOne, DirectExchange directExchange){
return BindingBuilder.bind(directQueueOne).to(directExchange).with(ROUTING_KEY);
} /**
* @author 七脉
* 描述:将第二个DirectQueueTwo队列绑定到DirectExchange交换机
* @param directQueueOne
* @param directExchange
* @return
*/
@Bean
public Binding bindingDirectQueueTwo(Queue directQueueTwo, DirectExchange directExchange){
return BindingBuilder.bind(directQueueTwo).to(directExchange).with(ROUTING_KEY);
} /**
* @author 七脉
* 描述:将第一个TopicQueueOne队列绑定到TopicExchange交换机
* @param topicQueueOne
* @param topicExchange
* @return
*/
@Bean
public Binding bindingTopicQueueOne(Queue topicQueueOne, TopicExchange topicExchange){
return BindingBuilder.bind(topicQueueOne).to(topicExchange).with(TOPICS_ONE);
} /**
* @author 七脉
* 描述:将第二个TopicQueueOne队列绑定到TopicExchange交换机
* @param topicQueueOne
* @param topicExchange
* @return
*/
@Bean
public Binding bindingTopicQueueTwo(Queue topicQueueTwo, TopicExchange topicExchange){
return BindingBuilder.bind(topicQueueTwo).to(topicExchange).with(TOPICS_MORE);
} }
2.生产者提供消息给队列
package com.qy.mq.provider; import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author 七脉
* 描述:MQ消息发送类
*/
@Service
public class ProviderService { @Autowired
private AmqpTemplate amqpTemplate; /**
* @author 七脉
* 描述:发送普通队列消息 HelloWorld
* @param msg
*/
public void sendMsgForHelloWorldQueue(String msg){
System.out.println("普通队列HelloWorld-生产者发送:"+msg);
amqpTemplate.convertAndSend(RabbitmqConfig.HELLO_WORLD_QUEUE, msg);
} /**
* @author 七脉
* 描述:发送工作队列消息
* @param msg
*/
public void sendMsgForWorkQueue(String msg){
System.out.println("工作队列-生产者发送:"+msg);
amqpTemplate.convertAndSend(RabbitmqConfig.WORK_QUEUE, msg);
} /**
* @author 七脉
* 描述:发送到FanoutExchange交换机,交换机会发送到绑定的队列
* @param msg
*/
public void sendMsgForFanoutExchange(String msg){
System.out.println("FanoutExchange交换机-生产者发送:"+msg);
amqpTemplate.convertAndSend(RabbitmqConfig.FANOUT_EXCHANGE, null, msg);
} /**
* @author 七脉
* 描述:发送消息到DirectExchange交换机,交换机会发送到绑定且指定routing-key的队列
* @param msg
*/
public void sendMsgForDirectExchange(String msg){
System.out.println("DirectExchange交换机-生产者发送:"+msg);
amqpTemplate.convertAndSend(RabbitmqConfig.DIRECT_EXCHANGE, RabbitmqConfig.ROUTING_KEY, msg);
} /**
* @author 七脉
* 描述:发送消息到TopicExchange交换机,交换机会发送到绑定且匹配通配符的队列
* @param msg
*/
public void sendMsgForTopicExchange(String msg, String wildcard){
System.out.println("TopicExchange交换机-生产者发送:"+msg);
amqpTemplate.convertAndSend(RabbitmqConfig.TOPIC_EXCHANGE, wildcard, msg);
}
}
3.消费者监听消费队列消息
package com.qy.mq.consumer; import java.io.IOException; import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.stereotype.Service; import com.rabbitmq.client.Channel; /**
* @author 七脉
* 描述:普通队列helloworld,一个生产者、一个队列、一个消费者
*/
@Service
public class ConsumerHelloWorld { @Value("${server.port}")
private String port; @RabbitListener(queues=RabbitmqConfig.HELLO_WORLD_QUEUE)
public void recive(String msg, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag) throws IOException {
System.out.println(msg);
channel.basicAck(deliveryTag, false);//应答
//channel.basicNack(deliveryTag, false, true);//不应答
//channel.basicReject(deliveryTag, true);//拒绝应答
} }
RabbitMQ的使用Demo的更多相关文章
- rabbitmq延迟队列demo
1. demo详解 1.1 工程结构: 1.2 pom 定义jar包依赖的版本.版本很重要,rabbit依赖spring,两者必须相一致,否则报错: <properties> <sp ...
- .net下redis和rabbitmq简单使用demo
是参考 一下两篇博文整理了下. Redis: https://www.cnblogs.com/5ishare/p/6492380.html RabbitMq: https://www.cnbl ...
- RabbitMQ之消费者Demo(队列参数详细说明)
package com.jiefupay; import java.io.IOException; import java.util.HashMap; import java.util.Map; 8 ...
- RabbitMQ 消息队列 DEMO
1. 引用 RabbitMQ.Client.5.1.0 2. http://localhost:15672/ public class TestController : ApiController { ...
- SpringBoot集成RabbitMQ消息队列搭建与ACK消息确认入门
1.RabbitMQ介绍 RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性.扩展性.高可用性等方面表现不俗.Rabbi ...
- rabbitMq 教程
https://github.com/401Studio/WeekLearn/issues/2 目录 RabbitMQ 概念 exchange交换机机制 什么是交换机 binding? Direct ...
- AMQP协议与RabbitMQ、MQ消息队列的应用场景
什么是AMQP? 在异步通讯中,消息不会立刻到达接收方,而是被存放到一个容器中,当满足一定的条件之后,消息会被容器发送给接收方,这个容器即消息队列,而完成这个功能需要双方和容器以及其中的各个组件遵守统 ...
- spring-boot rabbitMq 完整项目搭建,包括创建、发送、监听
写在开始 rabbitMq 代码按照三部分介绍 第一部分 交换机和队列的创建 第二部分 消息发送 第三部分 消息监听 第一部分 1 建立queue 2 建立exchange 3 exchange绑定q ...
- rabbitmq文章源
网易杭研后台技术中心的博客 rabbitmq topic简单demo http://blog.csdn.net/cugb1004101218/article/details/21243927?utm_ ...
随机推荐
- Thrift源码分析(二)-- 协议和编解码
协议和编解码是一个网络应用程序的核心问题之一,客户端和服务器通过约定的协议来传输消息(数据),通过特定的格式来编解码字节流,并转化成业务消息,提供给上层框架调用. Thrift的协议比较简单,它把协议 ...
- [HeadFrist-HTMLCSS学习笔记]第二章深入了解超文本:认识HTML中的“HT”
[HeadFrist-HTMLCSS学习笔记]第二章深入了解超文本:认识HTML中的"HT" 敲黑板!!! 创建HTML超链接 <a>链接文本(此处会有下划线,可以单击 ...
- CentOS安装Hadoop
Hadoop的核心由3个部分组成: HDFS: Hadoop Distributed File System,分布式文件系统,hdfs还可以再细分为NameNode.SecondaryNameNode ...
- LESS是一个CSS预处理器,跨浏览器友好,提供诸如变量,函数, mixins 和操作等功能,可以构建动态CSS
什么是LESS? LESS是一个CSS预处理器,可以为网站启用可自定义,可管理和可重用的样式表. LESS是一种动态样式表语言,扩展了CSS的功能. LESS也是跨浏览器友好. CSS预处理器是一种脚 ...
- Logstash测试的时候,报Error occurred during initialization of VM,Could not reserve enough space for object heap
今天配置Logstash的时候,启动输入logstash ‐e 'input { stdin { } } output { stdout {} }'就开始报错了,Error occurred duri ...
- apache添加ssl协议实现用户认证
目标 1对服务器的访问由http改为https, 2仅有证书的客户端可以访问服务器, 3.通过服务器端的配置,可以停用某个客户端的证书. 一 Apache服务器相关配置: 在../apache/con ...
- 【Rust】Rust的安装和配置
-----------------------参考文档------------------------------------- https://www.rust-lang.org/tools/ins ...
- docker封装mysql镜像
一.概述 直接使用官方的镜像 docker pull mysql:5.7 但是mysqld.cnf并没有优化,还是默认的. 二.封装镜像 创建目录 # dockerfile目录 mkdir -p /o ...
- [转] js async await 终极异步解决方案
阅读目录 回顾 Promise async await 字面理解 async.await 如何执行 await 操作符 总结 既然有了promise 为什么还要有async await ? 当然是pr ...
- C#DataTable使用方法详解
在项目中常常常使用到DataTable,假设DataTable使用得当,不仅能使程序简洁有用,并且可以提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结. 1.添加引用 1 2 ...