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_ ...
随机推荐
- java 栈
package testjavapro; import java.util.*; public class testjava { static void showpush(Stack<Integ ...
- app内嵌h5分享到小程序分享功能
if (this.GLOBAL.env !== 'production') { try { window.JSBridge.shareMiniProgramToWx('https://www.lexi ...
- 2018-2019-2 20165315《网络对抗技术》Exp9 Web安全基础
2018-2019-2 20165315<网络对抗技术>Exp9 Web安全基础 目录 一.实验内容 二.实验步骤 1.Webgoat前期准备 2.SQL注入攻击 Command Inje ...
- 解决myeclipse2017 properties中文被Unicode编码
输入:http://propedit.sourceforge.jp/eclipse/updates/ 在线安装插件解决.
- python 'utf-8' codec can't decode byte 0xb8 in position 0: invalid start byte
在导入csv文件中,出现如上所示的错误,经过查阅资料,解决方法如下: 方法一: pd.read_csv(file_path, encoding='unicode_escape') 方法二: pd.re ...
- 转载:Linux命令行快捷键
常用 Ctrl + 左右键:在单词之间跳转 Ctrl + A:跳到本行的行首 Ctrl + E:跳到页尾 Ctrl + U:删除当前光标前面的所有文字(还有剪切功能) Ctrl + K:删除当前光标后 ...
- CentOS7 mysql 连接不上 :[ERROR] InnoDB: The innodb_system data file 'ibdata1' must be writable
mysql一直连接不上我的数据库,输入密码也进不去mysql. 报连接不上服务的错误. Can 't connect to local MySQL server through socket '/tm ...
- 集合单列--Colletion
集合 学习集合的目标: 会使用集合存储数据 会遍历集合,把数据取出来 掌握每种集合的特性 集合和数组的区别 数组的长度是固定的.集合的长度是可变的. 数组中存储的是同一类型的元素,可以存储基本数据类型 ...
- Tomcat 对静态资源的处理
Tomcat 中的请求都是由 Servlet 处理,静态资源也不例外.在默认的 web.xml 中,配置了一个 DefaultServlet 用于处理静态资源,它支持缓存和断点续传. DefaultS ...
- 整理:WPF中Xaml中绑定枚举的写法
原文:整理:WPF中Xaml中绑定枚举的写法 目的:在Combobox.ListBox中直接绑定枚举对象的方式,比如:直接绑定字体类型.所有颜色等枚举类型非常方便 一.首先用ObjectDataPro ...