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

相关推荐
User_芊芊君子31 分钟前
【JavaSE】复习总结
java·开发语言·python
计算机毕业设计木哥33 分钟前
计算机毕业设计 基于Python+Django的医疗数据分析系统
开发语言·hadoop·后端·python·spark·django·课程设计
橘颂TA37 分钟前
【Qt】项目的创建 and 各个控件的使用
开发语言·qt
我有一颗五叶草40 分钟前
线程间通信
java·开发语言
测试界清流41 分钟前
postman接口功能测试
开发语言·lua
我真的是大笨蛋5 小时前
K8S-Pod(下)
java·笔记·云原生·容器·kubernetes
碳水加碳水5 小时前
Java代码审计实战:XML外部实体注入(XXE)深度解析
java·安全·web安全·代码审计
努力也学不会java6 小时前
【设计模式】 原型模式
java·设计模式·原型模式
方渐鸿7 小时前
【2024】k8s集群 图文详细 部署安装使用(两万字)
java·运维·容器·kubernetes·k8s·运维开发·持续部署
学亮编程手记7 小时前
K8S v1.33 版本主要新特性介绍
java·容器·kubernetes