Loading

RabbitMQ:Direct Exchange

一.相关概念

Exchange:接收消息,并根据路由键转发消息到所绑定的队列。

属性:

  name:名称

  type:交换机类型direct/topic/fanout/headers

  durability:是否需要持久化

  auto delete:当最后一个绑定到Exchange上的队列删除后,自动删除该Exchange

  internal:当前Exchange是否用于RabbitMQ内部使用,默认为false

  Arguments:扩展参数,用于扩展AMQP协议自制使用。

二.Direct Exchange

所有发送到Direct Exchange的消息会被转发到RoutingKey中指定的QUEUE.

注意:Direct模式使用RabbitMQ自带的Exchange:Default Exchange,所以不需要将Exchange进行任何绑定操作。队列名和routingkey必须完全匹配,消息才能被队列接收。

三.消费者

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
    //创建一个连接工厂
    ConnectionFactory connectionFactory = new ConnectionFactory();
    connectionFactory.setHost("192.168.10.132");
    connectionFactory.setPort(5672);
    connectionFactory.setVirtualHost("/");
    //创建连接
    Connection connection = connectionFactory.newConnection();
    //通过连接创建一个Channel
    Channel channel = connection.createChannel();
    //创建一个队列
    String exchangeName = "test_direct_exchange";
    String exchangeType = "direct";
    String queueName = "direct";
    String routingKey = "test.direct";
    String routingKey2 = "direct";
    //声明一个交换机
    channel.exchangeDeclare(exchangeName,exchangeType,true,false,false,null);
    //声明一个队列
    channel.queueDeclare(queueName,false,false,false,null);
    //建立绑定关系
    channel.queueBind(queueName,exchangeName,routingKey);
    channel.queueBind(queueName,exchangeName,routingKey2);
    //创建一个消费者
    QueueingConsumer consumer = new QueueingConsumer(channel);
    //设置Channel
    channel.basicConsume(queueName,true,consumer);
    //获取消息
    while (true){
        QueueingConsumer.Delivery delivery = consumer.nextDelivery();
        String msg = new String(delivery.getBody());
        System.out.println("消费端:"+msg);
    }
 
}

四.生产者

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static void main(String[] args) throws IOException, TimeoutException {
    //创建一个连接工厂
    ConnectionFactory connectionFactory = new ConnectionFactory();
    connectionFactory.setHost("192.168.10.132");
    connectionFactory.setPort(5672);
    connectionFactory.setVirtualHost("/");
    //创建连接
    Connection connection = connectionFactory.newConnection();
    //通过连接创建一个Channel
    Channel channel = connection.createChannel();
    //通过Channel发送数据
    channel.basicPublish("test_direct_exchange","direct",null,"test direct exchange".getBytes());
    //关闭连接
    channel.close();
    connection.close();
}

 关系拓扑:

 

 生产者设置routingKey无论传direct或者传test.direct,都可以给消费者发送信息。但是设置其他的,消费者都无法接收消息。

posted @   秋风飒飒吹  阅读(369)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示