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

相关推荐
卡尔特斯3 小时前
Android Kotlin 项目代理配置【详细步骤(可选)】
android·java·kotlin
白鲸开源3 小时前
Ubuntu 22 下 DolphinScheduler 3.x 伪集群部署实录
java·ubuntu·开源
ytadpole3 小时前
Java 25 新特性 更简洁、更高效、更现代
java·后端
纪莫4 小时前
A公司一面:类加载的过程是怎么样的? 双亲委派的优点和缺点? 产生fullGC的情况有哪些? spring的动态代理有哪些?区别是什么? 如何排查CPU使用率过高?
java·java面试⑧股
JavaGuide4 小时前
JDK 25(长期支持版) 发布,新特性解读!
java·后端
用户3721574261354 小时前
Java 轻松批量替换 Word 文档文字内容
java
白鲸开源4 小时前
教你数分钟内创建并运行一个 DolphinScheduler Workflow!
java
Java中文社群5 小时前
有点意思!Java8后最有用新特性排行榜!
java·后端·面试
代码匠心5 小时前
从零开始学Flink:数据源
java·大数据·后端·flink
间彧5 小时前
Spring Boot项目中如何自定义线程池
java