RabbitMQ--Routing之订阅模型-Topic

Routing之订阅模型-Topic

Topic类型的Exchange与Direc相比,都是可以根据RoutingKey把消息路由到不同的队列。只不过Topic类型Exchange可以让队列再绑定RoutingKey的时候使用通配符!这种模型RoutingKey一般都是由一个或多个单词组成,多个单词之间以“.”分割,例如item.insert

在这里插入图片描述
其中,匹配不多不少恰好1个词,#匹配一个或多个词;比如:
audit .# 匹配audit.irs.corporate或者audit.irs
audit .
只能匹配audit.irs

Provider

public class Provider {
    
    
    public static void main(String[] args) throws IOException {
    
    
        //获取连接对象
        Connection connection = RabbitMqUtils.getConnection();
        Channel channel = connection.createChannel();
        //声明交换机以及交换机类型 topic
        String exchangeName = "topics";
        channel.exchangeDeclare(exchangeName,"topic");
        //发布消息
        String routingKey = "user.save";
        channel.basicPublish(exchangeName,routingKey,null,("这里是topic动态路由模型,routekey:["+routingKey+"]").getBytes());
        //关闭资源
        RabbitMqUtils.closeConnectionAndChannel(channel,connection);
    }
}

Consumer1

public class Consumer1 {
    
    
    public static void main(String[] args) throws IOException {
    
    
        Connection connection = RabbitMqUtils.getConnection();
        Channel channel = connection.createChannel();
        String exchangeName = "topics";
        //声明交换机以及交换机类型
        channel.exchangeDeclare(exchangeName, "topic");
        //创建临时队列
        String queue = channel.queueDeclare().getQueue();
        //绑定队列和交换机 动态统配符形式 route key
        channel.queueBind(queue, exchangeName, "user.*");
        //消费消息
        channel.basicConsume(queue, true, new DefaultConsumer(channel) {
    
    
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
                                       byte[] body) throws IOException {
    
    
                System.out.println("消费者1:" + new String(body));
            }
        });
        //关闭连接
        RabbitMqUtils.closeConnectionAndChannel(channel, connection);
    }
}

Consumer2

public class Consumer2 {
    
    
    public static void main(String[] args) throws IOException {
    
    
        Connection connection = RabbitMqUtils.getConnection();
        Channel channel = connection.createChannel();
        String exchangeName = "topics";
        //声明交换机以及交换机类型
        channel.exchangeDeclare(exchangeName, "topic");
        //创建临时队列
        String queue = channel.queueDeclare().getQueue();
        //绑定队列和交换机 动态统配符形式 route key
        channel.queueBind(queue, exchangeName, "user.#");
        //消费消息
        channel.basicConsume(queue, true, new DefaultConsumer(channel) {
    
    
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
                                       byte[] body) throws IOException {
    
    
                System.out.println("消费者2:" + new String(body));
            }
        });
        //关闭连接
        RabbitMqUtils.closeConnectionAndChannel(channel, connection);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_38530648/article/details/114037368