RabbitMQ的发布订阅模式

发布订阅模式

是群发的概念,每条消息可以发送给多个消费者

在订阅模型中,多了一个 Exchange 角色

Exchange:交换机(X)。一方面,接收生产者发送的消息。另一方面,知道如何处理消息,例如递交给某个特别队列、 递交给所有队列、或是将消息丢弃。到底如何操作,取决于Exchange的类型。Exchange有常见以下3种类型:

  1. Fanout:广播,将消息交给所有绑定到交换机的队列

  2. Direct:定向,把消息交给符合指定routing key 的队列

  3. Topic:通配符,把消息交给符合routing pattern(路由模式) 的队列

    Exchange(交换机)只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与 Exchange 绑定,或者没有符合 路由规则的队列,那么消息会丢失

Exchange和Queue之间还需要绑定才能发送消息

生产者代码
java 复制代码
public class PSProducer {
	public static void main(String[] args) throws Exception {
		//创建连接
		ConnectionFactory cf = new ConnectionFactory();
		cf.setHost("192.168.64.140");
		ccf.setPort(5672);//可选,5672是默认端口
		f.setUsername("guest");
		cf.setPassword("guest");
		Connection nc = cf.newConnection();
		Channel cc = nc.createChannel();
		//定义交换机
		//服务器中如果没有交换机,就创建,有就直接使用
		cc.exccangeDeclare("logs", "fanout");
		//向交换机发送数据
		while(true) {
			System.out.print("输入:");
			String s = new Scanner(System.in).nextLine();
			cc.basicPublish("logs", "", null, s.getBytes());
		}
	}
}
消费者代码
java 复制代码
public class PSConsumer {
	public static void main(String[] args) throws Exception {
		//创建连接
		ConnectionFactory cf = new ConnectionFactory();
		cf.setHost("192.168.64.140");
		ccf.setPort(5672);//可选,5672是默认端口
		f.setUsername("guest");
		cf.setPassword("guest");
		Connection nc = cf.newConnection();
		Channel cc = nc.createChannel();
		//定义交换机
		//服务器中如果没有交换机,就创建,有就直接使用
		cc.exccangeDeclare("logs", "fanout");
		//cc.queueDeclare(UUID.randomUUID().toString(), false, true, true, null);
		String queue = cc.queueDeclare().getQueue();
		cc.queueBind(queue, "logs", "");

		//处理数据
		DeliverCallback deliverCallback = new DeliverCallback() {

			@Override
			public void handle(String consumerTag, Delivery message) throws IOException {
				byte[] a = message.getBody();
				String b = new String(a);
				System.out.println("收到:"+b);
				System.out.println("消息处理完毕");
			}
		};
		CancelCallback cancelCallback = new CancelCallback() {
			@Override
			public void handle(String consumerTag) throws IOException {

			}
		};
		//3.接收数据
		/**第二个参数:
		 *         true:自动确认
		 *         false:手动确认
		 */
		cc.basicConsume(queue,true, deliverCallback, cancelCallback);
	}
}

上一篇文章:RabbitMQ的工作模式-CSDN博客https://blog.csdn.net/Z0412_J0103/article/details/143354823下一篇文章:

相关推荐
晚染烟8 分钟前
每日八股day17
redis
嘻哈∠※1 小时前
0061基于 SpringBoot 的投稿与稿件处理系统设计与实现
java·spring boot·后端
WWJA王文举1 小时前
I²C通信完整流程详解:START、地址、ACK、数据、Repeated START和STOP一次讲透
c语言·开发语言
m0_380743871 小时前
给大模型调用加一层本地缓存,让重复请求直接命中磁盘
缓存
zhanghaha13142 小时前
Python进阶教程:6_JSON 数据解析 —— 新手完全指南
开发语言·python·json
白狐_7982 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander2583 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
码匠许师傅3 小时前
【C++ 面试真题】聊聊 C++ 的拷贝构造与拷贝赋值
java·c++·面试
qq_448011163 小时前
C语言中的动态内存分配
c语言·开发语言·php
FakeOccupational3 小时前
【电路笔记 STM32】Cortex-M7 内核上的数据缓存(D-Cache)结构+MPU+DMA&Cache+STM32CubeMX配置
笔记·stm32·缓存