RabbitMQ通信方式之Routing

RabbitMQ通信方式之Routing

Routing通信方式结构图

Routing模式和PubSub模式的区别:

  • Routing模式又称为Direct模式,它是一种点对点的消息传输模式。在Routing模式中,生产者将消息发送到一个Exchange(交换机),Exchange会根据消息的Routing Key(路由键)来将消息转发到相应的队列中。消费者可以绑定到一个或多个队列,通过设置不同的Routing Key来接收不同的消息。

  • PubSub模式又称为发布订阅模式,它是一种广播式的消息传输模式。在PubSub模式中,消息发送到一个Exchange,并且Exchange会将消息广播给所有绑定到它上面的队列。

  1. 添加RabbitMQ和Junit工具栏的maven依赖

<!--rabbitmq-->
<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
<version>5.12.0</version>
</dependency>
<!--junit-->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>
  1. 创建一个构建连接的工具类

public class RabbitMQConnectionUtil {
    public static final String RABBITMQ_HOST = "xxx.xx.xxx.xxx";   //设置你自己的RabbitMQ服务ip
    public static final int RABBITMQ_PORT = 5672;
    public static final String RABBITMQ_USERNAME = "guest";
    public static final String RABBITMQ_PASSWORD = "guest";
    public static final String RABBITMQ_VIRTUAL_HOST = "/";
    /**
     * 构建RabbitMQ的连接对象
     */
        public static Connection getConnection() throws Exception {
        //1. 创建Connection工厂
        ConnectionFactory factory = new ConnectionFactory();

        //2. 设置RabbitMQ的连接信息
        factory.setHost(RABBITMQ_HOST);
        factory.setPort(RABBITMQ_PORT);
        factory.setUsername(RABBITMQ_USERNAME);
        factory.setPassword(RABBITMQ_PASSWORD);
        factory.setVirtualHost(RABBITMQ_VIRTUAL_HOST);

        //3. 返回连接对象
        Connection connection = factory.newConnection();
        return connection;
    }
  1. 创建生产者

public class Producer {

    private static final String EXCHANGE_NAME = "routing-exchange";
    public static final String QUEUE_NAME1 = "routing-one";
    public static final String QUEUE_NAME2 = "routing-two";

    @Test
    public void pubSub() throws Exception {
        //1.获取连接对象
        Connection connection = RabbitMQConnectionUtil.getConnection();
        //2.构建Channel
        Channel channel = connection.createChannel();
        //3.构建交换机 exchange类型为direct(路由模式)
        channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);
        //4.构建队列
        channel.queueDeclare(QUEUE_NAME1,false,false,false,null);
        channel.queueDeclare(QUEUE_NAME2,false,false,false,null);
        //5.绑定交换机和队列,使用的是DIRECT类型的交换机
        channel.queueBind(QUEUE_NAME1,EXCHANGE_NAME,"ORANGE");
        channel.queueBind(QUEUE_NAME2,EXCHANGE_NAME,"BLACK");
        channel.queueBind(QUEUE_NAME2,EXCHANGE_NAME,"GREEN");
        //6.发消息到交换机
        channel.basicPublish(EXCHANGE_NAME,"ORANGE",null,"橙子!".getBytes());
        channel.basicPublish(EXCHANGE_NAME,"BLACK",null,"黑葡萄!".getBytes());
        //因为没有构建WHITE的路由规则,所以该消息不会路由到任何队列中
        channel.basicPublish(EXCHANGE_NAME,"WHITE",null,"兔子!".getBytes());
        System.out.println("消息成功发送!");
    }
}
  1. 创建消费者

public class Consumer {

    @Test
    public void consume1() throws Exception {
        //1.获取连接对象
        Connection connection = RabbitMQConnectionUtil.getConnection();
        //2.构建Channel
        Channel channel = connection.createChannel();
        //3.构建队列
        channel.queueDeclare(Producer.QUEUE_NAME1,false,false,false,null);
        //4.监听消息
        DefaultConsumer callback = new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("消费者获取到消息:" + new String(body,"UTF-8"));
            }
        };
        channel.basicConsume(Producer.QUEUE_NAME1,true,callback);
        System.out.println("消费者开始监听队列");

        System.in.read();
    }
}
  1. 启动生产者和消费者后,可以看到消费者的日志打印,成功消费到routing-one队列中的消息:“橙子!”

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

像鸟一样菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值