RabbitMQ 学习笔记

5种队列模式:

è¿éåå¾çæè¿°

  从第三种开始  消息发布 - 订阅模式 ,路由模式, 主题模式 。 

  这几种关注的重点是 生产者发布的消息 会被放到哪个队列中。   定义的交换机分别为

 订阅模式 : fanout  将消息分散开 。

è¿éåå¾çæè¿°

解读:
1、1个生产者,多个消费者
2、每一个消费者都有自己的一个队列
3、生产者没有将消息直接发送到队列,而是发送到了交换机
4、每个队列都要绑定到交换机
5、生产者发送的消息,经过交换机,到达队列,实现,一个消息被多个消费者获取的目的
注意:一个消费者队列可以有多个消费者实例,只有其中一个消费者实例会消费

 路由模式 : direct   按照routingkey 直接匹配发送消息到队列 。

è¿éåå¾çæè¿°

解读: 在订阅模式上加入了,routingkey,需要根据匹配的key将消息发送到对应的队列。

可以通过 不设置 routingkey 达到 订阅模式的效果,对routingkey是直接匹配的。

比如:发送的消息 routingkey 为 delete ,队列1 和 队列2 都会收到消息。

 主题模式 : topic    可以有通配符,发送到匹配的队列中。  

è¿éåå¾çæè¿°

è¿éåå¾çæè¿°

解读 :支持 routingkey 使用通配符进行模糊匹配。

比如下方中 ,routingkey 为 a.b 的将会放到 队列 2中,key为 delete 没有通配符的将会直接匹配(感觉和路由模式的差不多)。

 

代码实验:

导入rabbit客户端依赖:

<dependency>
   <groupId>com.rabbitmq</groupId>
   <artifactId>amqp-client</artifactId>
   <version>3.4.1</version>
</dependency>

 连接工具类 : 

import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class ConnectionUtil {

    public static Connection getConnection() throws Exception {
        //定义连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //设置服务地址
        factory.setHost("xx.xxx.xxx.xxx");
        //端口
        factory.setPort(5672);
        //设置账号信息,用户名、密码、vhost
        factory.setVirtualHost("my_vhost");
        factory.setUsername("admin");
        factory.setPassword("admin");
        // 通过工程获取连接
        Connection connection = factory.newConnection();
        return connection;
    }


}

只针对后面几种模式,通用的例子,需要自己改交换机名称和类型 。生产者类:

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

public class MySendRouting {

    // 交换机名称
    private final static String EXCHANGE_NAME = "test_exchange_topic";

    public static void main(String[] argv) throws Exception {
        // 获取到连接以及mq通道
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();

        // 声明exchange 并设置 类型
        channel.exchangeDeclare(EXCHANGE_NAME, "topic");

        // 消息内容
        String message = "Hello World!";
        // 发送消息到 指定交换机 , routingkey 为 delete
        channel.basicPublish(EXCHANGE_NAME, "delete", null, message.getBytes());
        System.out.println(" [x] Sent '" + message + "'");
        channel.close();
        connection.close();

    }
}

 新建队列,绑定到交换机 

 

 

发送消息之后登陆rabbit的web管理页面查看 对应队列的消息数。

 

 

 

 

参考链接: https://blog.csdn.net/hellozpc/article/details/81436980

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值