RabbitMQ之Exchange Topics模式
1. “ * ”的使用:
生产者:
package com.toov5.topic; import java.io.IOException;
import java.util.concurrent.TimeoutException; import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.toov5.utils.MQConnectionUtils; //生产者 交换机类型 producerFanout类型
public class TopicProducer {
//交换机名称
private static final String EXCHANGE_NAME = "my_topic";
public static void main(String[] args) throws IOException, TimeoutException {
//建立MQ连接
Connection connection = MQConnectionUtils.newConnection();
//创建通道
Channel channel = connection.createChannel();
//生产者绑定交换机
channel.exchangeDeclare(EXCHANGE_NAME, "topic"); //交换机名称 交换机类型
String routingKey="log.email"; //消息只会给邮件类型的
//创建对应的消息
String msString = "my_Routing_destination_msg"+routingKey;
//通过频道 发送消息
System.out.println("生产者投递消息:"+msString);
channel.basicPublish(EXCHANGE_NAME, routingKey, null, msString.getBytes());
//关闭通道 和 连接
channel.close();
connection.close();
} }
消费者:
package com.toov5.topic; import java.io.IOException;
import java.util.concurrent.TimeoutException; import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.toov5.utils.MQConnectionUtils; //邮件消费者
public class ConsumerSMSTopic {
private static final String SMS_QUEUE ="sms_queue_topic";
//交换机名称
private static final String EXCHANGE_NAME = "my_topic";
public static void main(String[] args) throws IOException, TimeoutException {
System.out.println("短信消费者启动");
//建立MQ连接
Connection connection = MQConnectionUtils.newConnection();
//创建通道
Channel channel = connection.createChannel(); //消费者声明队列
channel.queueDeclare(SMS_QUEUE, false, false, false, null);
//消费者队列绑定 路由
channel.queueBind(SMS_QUEUE, EXCHANGE_NAME, "log.*");
//消费者监听消息
DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
//重写监听方法
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
String msg = new String(body,"UTF-8");
System.out.println("短信消费者获取生产者消息"+msg);
}
};
channel.basicConsume(SMS_QUEUE,true, defaultConsumer); //绑定队列 事件监听 }
}
package com.toov5.topic; import java.io.IOException;
import java.util.concurrent.TimeoutException; import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.toov5.utils.MQConnectionUtils; //邮件消费者
public class ConsumerEmailTopic {
private static final String EMAIL_QUEUE ="email_queue_topic";
//交换机名称
private static final String EXCHANGE_NAME = "my_topic";
public static void main(String[] args) throws IOException, TimeoutException {
System.out.println("邮件消费者启动");
//建立MQ连接
Connection connection = MQConnectionUtils.newConnection();
//创建通道
Channel channel = connection.createChannel(); //消费者声明队列
channel.queueDeclare(EMAIL_QUEUE, false, false, false, null);
//消费者队列绑定 路由
channel.queueBind(EMAIL_QUEUE, EXCHANGE_NAME, "log.email");
//消费者监听消息
DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
//重写监听方法
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
String msg = new String(body,"UTF-8");
System.out.println("邮件消费者获取生产者消息"+msg);
}
};
channel.basicConsume(EMAIL_QUEUE,true, defaultConsumer); //绑定队列 事件监听 }
}
可以看到两个消费者都可以接收到
2.换成 “#”
生产者:
package com.toov5.topic; import java.io.IOException;
import java.util.concurrent.TimeoutException; import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.toov5.utils.MQConnectionUtils; //生产者 交换机类型 producerFanout类型
public class TopicProducer {
//交换机名称
private static final String EXCHANGE_NAME = "my_topic";
public static void main(String[] args) throws IOException, TimeoutException {
//建立MQ连接
Connection connection = MQConnectionUtils.newConnection();
//创建通道
Channel channel = connection.createChannel();
//生产者绑定交换机
channel.exchangeDeclare(EXCHANGE_NAME, "topic"); //交换机名称 交换机类型
String routingKey="log.email.sms"; //消息只会给邮件类型的
//创建对应的消息
String msString = "my_Routing_destination_msg"+routingKey;
//通过频道 发送消息
System.out.println("生产者投递消息:"+msString);
channel.basicPublish(EXCHANGE_NAME, routingKey, null, msString.getBytes());
//关闭通道 和 连接
channel.close();
connection.close();
} }
消费者:
package com.toov5.topic; import java.io.IOException;
import java.util.concurrent.TimeoutException; import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.toov5.utils.MQConnectionUtils; //邮件消费者
public class ConsumerSMSTopic {
private static final String SMS_QUEUE ="sms_queue_topic";
//交换机名称
private static final String EXCHANGE_NAME = "my_topic";
public static void main(String[] args) throws IOException, TimeoutException {
System.out.println("短信消费者启动");
//建立MQ连接
Connection connection = MQConnectionUtils.newConnection();
//创建通道
Channel channel = connection.createChannel(); //消费者声明队列
channel.queueDeclare(SMS_QUEUE, false, false, false, null);
//消费者队列绑定 路由
channel.queueBind(SMS_QUEUE, EXCHANGE_NAME, "log.#");
//消费者监听消息
DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
//重写监听方法
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
String msg = new String(body,"UTF-8");
System.out.println("短信消费者获取生产者消息"+msg);
}
};
channel.basicConsume(SMS_QUEUE,true, defaultConsumer); //绑定队列 事件监听 }
}
package com.toov5.topic; import java.io.IOException;
import java.util.concurrent.TimeoutException; import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.toov5.utils.MQConnectionUtils; //邮件消费者
public class ConsumerEmailTopic {
private static final String EMAIL_QUEUE ="email_queue_topic";
//交换机名称
private static final String EXCHANGE_NAME = "my_topic";
public static void main(String[] args) throws IOException, TimeoutException {
System.out.println("邮件消费者启动");
//建立MQ连接
Connection connection = MQConnectionUtils.newConnection();
//创建通道
Channel channel = connection.createChannel(); //消费者声明队列
channel.queueDeclare(EMAIL_QUEUE, false, false, false, null);
//消费者队列绑定 路由
channel.queueBind(EMAIL_QUEUE, EXCHANGE_NAME, "log.email");
//消费者监听消息
DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
//重写监听方法
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
String msg = new String(body,"UTF-8");
System.out.println("邮件消费者获取生产者消息"+msg);
}
};
channel.basicConsume(EMAIL_QUEUE,true, defaultConsumer); //绑定队列 事件监听 }
}
总结 “*” 匹配一个词 “#”匹配多个词
RabbitMQ之Exchange Topics模式的更多相关文章
- RabbitMQ之Exchange Direct模式
场景: 生产者发送消息到交换机并指定一个路由key, 消费者队列绑定到交换机时要指定路由key(key匹配就能接受消息,key不匹配就不能接受消息) 例如:我们可以把路由key设置为insert ,那 ...
- RabbitMq 6种使用模式
RabbitMQ的5种模式与实例 1.1 简单模式Hello World 功能:一个生产者P发送消息到队列Q,一个消费者C接收 生产者实现思路: 创建连接工厂ConnectionFactory,设置服 ...
- RabbitMQ的六种工作模式总结
最近学习RabbitMQ的使用方式,记录下来,方便以后使用,也方便和大家共享,相互交流. RabbitMQ的六种工作模式: 1.Work queues2.Publish/subscribe3.Rout ...
- 面试官:RabbitMQ有哪些工作模式?
哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 今天又.又.又来面试了,还是老规 ...
- RabbitMQ系列(三)RabbitMQ交换器Exchange介绍与实践
RabbitMQ交换器Exchange介绍与实践 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchang ...
- Rabbitmq交换器Exchange和消息队列
通常我们谈到队列服务, 会有三个概念: 发消息者.队列.收消息者,RabbitMQ 在这个基本概念之上, 多做了一层抽象, 在发消息者和 队列之间, 加入了交换器 (Exchange). 这样发消息者 ...
- 【RabbitMQ学习之二】RabbitMQ四种交换机模式应用
环境 win7 rabbitmq-server-3.7.17 Erlang 22.1 一.概念1.队列队列用于临时存储消息和转发消息.队列类型有两种,即时队列和延时队列. 即时队列:队列中的消息会被立 ...
- RabbitMQ交换器Exchange介绍与实践
RabbitMQ交换器Exchange介绍与实践 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchang ...
- 手把手一起入门 RabbitMQ 的六大使用模式(Java 客户端)
原文地址:手把手一起入门 RabbitMQ 的六大使用模式(Java 客户端) 为什么使用 MQ? 在这里我就不多说了,无非就是削峰.解耦和异步.这里没有很多关于 MQ 的理论和概念,只想手把手带你一 ...
随机推荐
- Squid 启动/停止/重载配置文件 命令
当你的 squid.conf 配置文档按照你的想法修改完以后,启动 squid 之旅就开始了. Squid安装设试命令: 1,初始化你在 squid.conf 里配置的 cache 目录 #/usr/ ...
- 【HBase基础教程】1、HBase之单机模式与伪分布式模式安装(转)
在这篇blog中,我们将介绍Hbase的单机模式安装与伪分布式的安装方式,以及通过浏览器查看Hbase的用户界面.搭建hbase伪分布式环境的前提是我们已经搭建好了hadoop完全分布式环境,搭建ha ...
- Spring 中的Null-Safety
之前一直在某些代码中看到过使用@Nullable 标注过的注释,当时也没有在意到底是什么意思,所以这篇文章来谈谈Spring中关于Null的那些事. 在Java中不允许让你使用类型表示其null的安全 ...
- Android sdk 更新失败解决方发整理
解决办法: 设置本地hosts windows里hosts位置在C:\Windows\System32\drivers\etc,找到hosts文件 直接在hosts文件的最后加一行: 74.125.2 ...
- spark standlone 伪分布式安装
一,在官网下载对应的版本http://spark.apache.org/downloads.html 二在linux中解压下来的spark包 三:配置环境变量 (1)在/etc/profi ...
- 篇三、开发前知识补充:Android的长度单位和屏幕分辨率,这个也是转载~~
这篇文章有点早,不过很实用.单位的实用看最后的红色标注的部分. 屏幕分辨率基础 1.术语和概念 术语 说明 备注 Screen size(屏幕尺寸) 指的是手机实际的物理尺寸,比如常用的2.8英寸,3 ...
- centos6搭建docker镜像私服
1.创建私服容器 docker run -d -e SETTINGS_FLAVOR=dev -e STORAGE_PATH=/tmp/registry -v /opt/data/registry:/t ...
- Android Studio SDK Manager 解决无法更新问题
一.首先要保证你可以FQ上google等网站. 这个..如何越过GFW就要靠自己了..网上也有很多教程.. 二.更改android sdk manager的option设置 选择Tools→Opini ...
- 安装mingw后,在命令窗体编译c文件
1.编译test.cpp文件 #include<iostream> int main(int argc,char **argv) { std::cout<<"he ...
- 驱动程序分层分离概念_总线驱动设备模型_P
分层概念: 驱动程序向上注册的原理: 比如:输入子程序一个input.c作为一层,下层为Dev.c和Dir.c,分别编写Dev.c和Dir.c向上Input.c注册:如图所示 分离概念: 分离概念主要 ...