一、生產者
package test.publish; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import utils.RabbitmqConUtil; public class Give { //定義交換機 private final static String EXCHANGE = "test-publish"; public static void main(String[] args) throws Exception { //創建連接和通道 Connection connection = RabbitmqConUtil.getConnection(); Channel channel = connection.createChannel(); //聲明交換機(類型fanout->發佈訂閱模式) channel.exchangeDeclare(EXCHANGE,"fanout"); //發送消息到交換機(交換機無法持久化,如果消息沒有及時接收,重啓後容易丟失數據) channel.basicPublish(EXCHANGE,"",null,"統一發布訂閱消息".getBytes()); } }
創建連接和通道後,聲明要用到的交換機,併發送消息到交換機中。
交換機無法持久化,所以一旦停機重啓的話,消息就會丟失。
注:生產者要提前運行一次,初始化交換機的存在,否則如果先啓動消費者的話就會造成報交換機不存在的錯誤。初始化交換機的過程中,不需要帶發送消息的操作。
二、消費者
創建兩個消費者GetOne和GetTwo,GetOne的內容大致如下:
package test.publish; import com.rabbitmq.client.*; import utils.RabbitmqConUtil; import java.io.IOException; public class GetOne { private final static String EXCHANGE = "test-publish"; //定義本消費者需要用到的隊列 private final static String QUEUE = "test-publish-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); //將隊列綁定到交換機 channel.queueBind(QUEUE,EXCHANGE,""); 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); } }
GetTwo的內容與上面一樣,更換個名字以便區分兩個消費者。
三、運行結果
先啓動一次生產者,把交換機初始化,避免消費者啓動接收消息報錯(也可以在web管理端自己手動添加,這樣就避免初始化了)。
然後,先後啓動GetOne和GetTwo兩個消費者,將兩個隊列綁定在交換機上。
最後再重啓生產者,發送消息,兩個消費者結果如下:
都接收到了統一發布的消息。