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下一篇文章:

相关推荐
benbenAItalk4 小时前
数字人口播视频的批量生产实践:素材规范、任务编排与质量验收
java·前端·音视频
sunshine22 girl4 小时前
Java学习二 基本语法2, 算术运算符
java·学习
2601_966949654 小时前
为什么量化策略需要大量历史股票数据?从回测可信度理解数据规模
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
niucloud-admin4 小时前
JAVA V6 多商户商城 开发文档——插件目录结构
java·开发语言
2601_962885724 小时前
如何用 Python 扫描 A 股跳空缺口并统计缺口回补概率?
java·前端·python
滕州市燕猫虎计算机科技工作室个体工商户4 小时前
Java锁
java·开发语言
多加点辣也没关系5 小时前
JavaScript|第31章:表单与控件
开发语言·javascript·ecmascript
菜鸟~noob2335 小时前
【电子战】 第09篇:阵列信号处理——波束形成、MVDR、MUSIC【含matlab代码】
开发语言·matlab·信号处理
ocean21035 小时前
2025-2026年Python面试高频知识点洞察
开发语言·python·面试·python八股文
零依赖极客5 小时前
Day 6·1 ARMv8.2 dotprod——vdotq_s32 一条指令做 4 个点积
c语言·开发语言·人工智能·矩阵·arm·vllm