一、生產者
聲明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進行初始化。
然後運行消費者GetOne把GetOne.*和GetThree.#兩個通配規則的路由key綁定到交換機上。
再次運行生產者發送消息,結果如下:
兩個消息都成功被GetOne接收。