Rabbitmq消息隊列:Topic話題模式簡單應用

一、生產者

  聲明topic話題模式的交換機,分別發送幾條消息到不同的路由key

package test.topic;

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

public class Give {

    //定義交換機
    private final static String EXCHANGE = "test-topic";

    public static void main(String[] args) throws Exception {
        //創建連接和通道
        Connection connection = RabbitmqConUtil.getConnection();
        Channel channel = connection.createChannel();
        //聲明交換機(類型topic->話題模式)
        channel.exchangeDeclare(EXCHANGE,"topic");
        //發送消息到交換機(交換機無法持久化,如果消息沒有及時接收,重啓後容易丟失數據)
        channel.basicPublish(EXCHANGE,"GetOne.oneMessage",null,"這是發送給GetOne.oneMessage的消息".getBytes());
        channel.basicPublish(EXCHANGE,"GetThree.oneMessage.value",null,"這是發送給GetThree.oneMessage.value的消息".getBytes());
    }

}

  這幾個消息的路由key嵌套了好幾層,方便對於消息進行話題的分類整合。

二、消費者

  topic模式的重點在於:

  針對於上面生產者消息發送的路由key,可以通過" * "和" # "等通配符來進行模糊匹配。

  " * "代表匹配一層,即直接匹配,比如a.*可以匹配到a.b,但是無法匹配到a.b.c。

  " # "代表多層匹配,比如a.#可以匹配到a.b,a.c.a.d,也可以匹配到a.b.c.d.e,一直向後擴展

  創建消費者GetOne:

package test.topic;

import com.rabbitmq.client.*;
import utils.RabbitmqConUtil;

import java.io.IOException;

public class GetOne {

    private final static String EXCHANGE = "test-topic";
    //定義本消費者需要用到的隊列
    private final static String QUEUE = "test-topic-one";

    public static void main(String[] args) throws Exception{
        Connection connection = RabbitmqConUtil.getConnection();
        final Channel channel = connection.createChannel();
        //聲明隊列
        channel.queueDeclare(QUEUE,false,false,false,null);
        //將隊列綁定到交換機(第二個參數是路由的key,需要多個的話就綁多個)
        channel.queueBind(QUEUE,EXCHANGE,"GetOne.*");
        channel.queueBind(QUEUE,EXCHANGE,"GetThree.#");
        channel.basicQos(1);
        DefaultConsumer defaultConsumer = new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String str = new String(body);
                System.out.println("GetOne接收:" + str);
                channel.basicAck(envelope.getDeliveryTag(),false);
            }
        };
        channel.basicConsume(QUEUE,false,defaultConsumer);

    }
}

三、運行結果

  先運行生產者對交換機test-topic進行初始化。

  

  然後運行消費者GetOneGetOne.*GetThree.#兩個通配規則的路由key綁定到交換機上。

  

  再次運行生產者發送消息,結果如下:

  

  兩個消息都成功被GetOne接收。

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章