Rabbitmq消息隊列:Publish/Subscribe發佈/訂閱模式簡單應用

一、生產者

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兩個消費者,將兩個隊列綁定在交換機上。

  

  最後再重啓生產者,發送消息,兩個消費者結果如下:

  

  

   都接收到了統一發布的消息。

 

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