1. 程式人生 > 其它 >《RabbitMQ系列教程-第四章-01-RabbitMQ工作模式之Simple模式》

《RabbitMQ系列教程-第四章-01-RabbitMQ工作模式之Simple模式》

技術標籤:# 《RabbitMQ系列教程》佇列rabbitmqjava訊息佇列交換機

RabbitMQ工作模式之Simple模式

4.1.1 簡介

simple模式就是我們之前做的快速入門案例

在這裡插入圖片描述
簡單模式中表現為一個生產者對應一個消費者,生產者(Producer)生產訊息傳送到佇列,消費者(Consumer)監聽此佇列,進行訊息的消費;

Simple模式官網介紹:https://www.rabbitmq.com/tutorials/tutorial-one-java.html

4.1.2 生產者

package com.lscl.rabbitmq;

import com.rabbitmq.
client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; public class Producer01_Hello { public static void main(String[] args) throws Exception{ // 1. 建立連線工廠 ConnectionFactory factory = new ConnectionFactory(); // 2. 設定連線引數 factory.
setHost("192.168.133.147"); factory.setPort(5672); factory.setVirtualHost("/"); factory.setUsername("guest"); factory.setPassword("guest"); // 3. 獲取連線物件 Connection connection = factory.newConnection(); // 4. 通過connection獲取Channel
Channel channel = connection.createChannel(); // 5. 定義一個交換機 /* 引數1(queue): 佇列名稱 引數2(durable): 是否要持久化佇列(mq重啟之後還在) 引數3(exclusive): 是否是獨佔佇列(只能有一個消費者監聽此佇列,沒有也不行) 引數4(autoDelete): 是否自動刪除(當沒有Consumer時,佇列自動刪除) 引數5(arguments): 佇列的其他引數(過期時間、最大訊息容量等) */ channel.queueDeclare("hello_world",true,false,false,null); String body="hello world"; // 6.傳送訊息 /* 引數1(exchange): 交換機的名稱,簡單模式下交換機會使用預設的交換機"" 引數2(routingKey): routingKey,路由名稱,在簡單模式下,routingKey就是佇列名稱 引數3(props): 訊息的一些配置資訊 引數4(body): 傳送的訊息(位元組) */ channel.basicPublish("","hello_world",null,body.getBytes()); // 7. 釋放資源 channel.close(); connection.close(); } }

4.1.3 消費者

package com.lscl.rabbitmq;

import com.rabbitmq.client.*;
import java.io.IOException;

public class Consumer01_Hello {

    public static void main(String[] args) throws Exception{
        // 建立連線工廠,用於獲取頻道channel
        ConnectionFactory factory = new ConnectionFactory();

        // 設定連線引數
        factory.setHost("192.168.40.132");
        factory.setPort(5672);
        factory.setUsername("guest");
        factory.setPassword("guest");
        factory.setVirtualHost("/");

        // 2.建立連線
        Connection connection = factory.newConnection();

        // 3.建立頻道
        Channel channel = connection.createChannel();

        // 4.建立佇列
    /*
        定義佇列,如果沒有此佇列則建立,如果有則不建立
        queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)

        queue:      佇列的名稱
        durable:    是否持久化佇列(mq重啟之後還在)
        exclusive:  是否獨佔(只能有一個消費者監聽此佇列)
        autoDelete: 是否自動刪除(當沒有Consumer時,自動刪除掉)
        arguments:  其他引數
     */
        channel.queueDeclare("hello_world", true, false, false, null);

        // 5. 接收訊息
    /*
        basicConsume(String queue, boolean autoAck, Consumer callback)

        queue:      佇列名稱
        autoAck:    是否開啟自動確認
        callback:   回撥物件
     */
        channel.basicConsume("hello_world", true, new DefaultConsumer(channel) {

            // 回撥方法,當收到訊息之後,會自動執行該方法
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
            /*
                1. consumerTag:標識
                2. envelope:獲取一些資訊,交換機,路由key...
                3. properties:配置資訊
                4. body:資料
             */
                System.out.println("consumerTag:" + consumerTag);
                System.out.println("Exchange:" + envelope.getExchange());
                System.out.println("RoutingKey:" + envelope.getRoutingKey());
                System.out.println("properties:" + properties);
                System.out.println("body:" + new String(body));
            }
        });
        // 不釋放資源,讓rabbitmq一直監聽
    }
}

4.1.4 小結

在Simple交換模式中,一個生產者對應一個消費者,不能對應多個消費者(有多個消費者就不是Simple模式了),生產者傳送訊息給預設的交換機(空字串""),訊息由預設的交換機(空字串)路由到佇列,消費者監聽佇列進行訊息的消費;


下一篇:《RabbitMQ系列教程-第四章-02-RabbitMQ工作模式之Work模式》