RabbitMQ消息模型之Direct消息模型

Direct消息模型

Java 复制代码
* 路由模型:
*    一个交换机可以绑定多个队列
*    生产者给交换机发送消息时,需要指定消息的路由键
*    消费者绑定队列到交换机时,需要指定所需要消费的信息的路由键
*    交换机会根据消息的路由键将消息转发到对应的队列

*    缺点:
*      当消息很多的时候,需要指定的路由键也会很多,究极复杂。
生产者
java 复制代码
package com.example.demo02.mq.direct;

import com.example.demo02.mq.util.ConnectionUtils;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

import java.io.IOException;

/**
 * @author Allen
 * 4/11/2024 9:30 AM
 * @version 1.0
 * @description: 路由模型发送者
 *
 * 路由模型:
 *    一个交换机可以绑定多个队列
 *    生产者给交换机发送消息时,需要指定消息的路由键
 *    消费者绑定队列到交换机时,需要指定所需要消费的信息的路由键
 *    交换机会根据消息的路由键将消息转发到对应的队列

 *    缺点:
 *      当消息很多的时候,需要指定的路由键也会很多,究极复杂。
 */
public class DirectSender {
    public static void main(String[] args) throws Exception {
        // 1:创建连接
        Connection connection = ConnectionUtils.getConnection();
        // 2:创建通道
        Channel channel = connection.createChannel();
        // 3:声明交换机   参数1:交换机名称 参数2:交换机类型 参数3:是否持久化
        channel.exchangeDeclare("direct.exchange", BuiltinExchangeType.DIRECT, false);

        // 6:发送消息
        String msg1 = "{To DirectReceiver1: orderId:1001}";
        String msg2 = "{To DirectReceiver2: orderId:1002}";
        // 参数1:交换机 参数2:路由键(与消费者相匹配) 参数3:其他参数 参数4:消息内容
        channel.basicPublish("direct.exchange","order.save",null,msg1.getBytes());
        channel.basicPublish("direct.exchange","order.update",null,msg2.getBytes());
        // 7:关闭通道
        channel.close();
        // 8:关闭连接
        connection.close();
    }
}
消费者1
java 复制代码
package com.example.demo02.mq.direct;

import com.example.demo02.mq.util.ConnectionUtils;
import com.rabbitmq.client.*;

import java.io.IOException;

/**
 * @author Allen
 * 4/11/2024 9:44 AM
 * @version 1.0
 * @description: 路由模型接收者1
 */
public class DirectReceiver1 {
    public static void main(String[] args) throws Exception {
        Connection connection = ConnectionUtils.getConnection();

        Channel channel = connection.createChannel();

        channel.exchangeDeclare("direct.exchange", BuiltinExchangeType.DIRECT, false);

        channel.queueDeclare("direct.queue1", false, false, false, null);

        channel.queueBind("direct.queue1","direct.exchange","order.save");

        Consumer consumer = new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {

                System.out.println("DirectReceiver1接收到的新增订单消息是:" + new String(body));
                channel.basicAck(envelope.getDeliveryTag(),false);
            }
        };
        channel.basicConsume("direct.queue1",false,consumer);
    }
}
消费者2
java 复制代码
package com.example.demo02.mq.direct;

import com.example.demo02.mq.util.ConnectionUtils;
import com.rabbitmq.client.*;

import java.io.IOException;

/**
 * @author Allen
 * 4/11/2024 9:44 AM
 * @version 1.0
 * @description: 路由模型接收者2
 */
public class DirectReceiver2 {
    public static void main(String[] args) throws Exception {
        Connection connection = ConnectionUtils.getConnection();

        Channel channel = connection.createChannel();

        channel.exchangeDeclare("direct.exchange", BuiltinExchangeType.DIRECT, false);

        channel.queueDeclare("direct.queue2", false, false, false, null);

        channel.queueBind("direct.queue2","direct.exchange","order.update");

        Consumer consumer = new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {

                System.out.println("DirectReceiver2接收到的修改订单消息:" + new String(body));
                channel.basicAck(envelope.getDeliveryTag(),false);
            }
        };
        channel.basicConsume("direct.queue2",false,consumer);
    }
}
结果
相关推荐
昊衡科技2 分钟前
在多阶段松弛实验中使用分布式光纤传感量化局部和非局部岩石变形
分布式·分布式光纤传感·ofdr
zt1985q40 分钟前
本地部署消息代理软件 RabbitMQ 并实现外部访问( Windows 版本 )
运维·服务器·windows·rabbitmq·ruby
夫唯不争,故无尤也3 小时前
分布式训练一站式入门:DP,DDP,DeepSpeed Zero Stage1/2/3(数据并行篇)
分布式
星哥说事4 小时前
分布式存储:Ceph、GlusterFS、MinIO架构与部署
分布式·ceph·架构
LitRad5 小时前
kafka问题解决
分布式·kafka
blammmp18 小时前
RabbitMQ:仲裁队列 && HAProxy
分布式·rabbitmq
9ilk18 小时前
【仿RabbitMQ的发布订阅式消息队列】--- 前置技术
分布式·后端·中间件·rabbitmq
Ribou18 小时前
无zookeeper Kafka 4.1.0 Raft 集群搭建
分布式·zookeeper·kafka
峰顶听歌的鲸鱼19 小时前
9.OpenStack管理(三)
运维·笔记·分布式·openstack·学习方法
铁锹少年1 天前
当多进程遇上异步:一次 Celery 与 Async SQLAlchemy 的边界冲突
分布式·后端·python·架构·fastapi