RabbitMQ——最常用的三大模式

Direct 模式#

  • 所有發送到 Direct Exchange 的消息被轉發到 RouteKey 中指定的 Queue。
  • Direct 模式可以使用 RabbitMQ 自帶的 Exchange: default Exchange,所以不需要將 Exchange 進行任何綁定(binding)操作。
  • 消息傳遞時,RouteKey 必須完全匹配才會被隊列接收,否則該消息會被拋棄,
RabbitMQ——最常用的三大模式

<code>Copyimport com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class DirectProducer {
public static void main(String[] args) throws Exception {
//1. 創建一個 ConnectionFactory 並進行設置
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setVirtualHost("/");
factory.setUsername("guest");
factory.setPassword("guest");

//2. 通過連接工廠來創建連接
Connection connection = factory.newConnection();

//3. 通過 Connection 來創建 Channel
Channel channel = connection.createChannel();

//4. 聲明
String exchangeName = "test_direct_exchange";
String routingKey = "item.direct";

//5. 發送
String msg = "this is direct msg";
channel.basicPublish(exchangeName, routingKey, null, msg.getBytes());
System.out.println("Send message : " + msg);

//6. 關閉連接
channel.close();
connection.close();
}
}

/<code>
<code>Copyimport com.rabbitmq.client.*;
import java.io.IOException;

public class DirectConsumer {

public static void main(String[] args) throws Exception {
//1. 創建一個 ConnectionFactory 並進行設置
ConnectionFactory factory = new ConnectionFactory();

factory.setHost("localhost");
factory.setVirtualHost("/");
factory.setUsername("guest");
factory.setPassword("guest");
\tfactory.setAutomaticRecoveryEnabled(true);
factory.setNetworkRecoveryInterval(3000);

//2. 通過連接工廠來創建連接
Connection connection = factory.newConnection();

//3. 通過 Connection 來創建 Channel
Channel channel = connection.createChannel();

//4. 聲明
String exchangeName = "test_direct_exchange";
String queueName = "test_direct_queue";
String routingKey = "item.direct";
channel.exchangeDeclare(exchangeName, "direct", true, false, null);
channel.queueDeclare(queueName, false, false, false, null);

//一般不用代碼綁定,在管理界面手動綁定
channel.queueBind(queueName, exchangeName, routingKey);

//5. 創建消費者並接收消息
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope,
AMQP.BasicProperties properties, byte[] body)
throws IOException {
String message = new String(body, "UTF-8");
System.out.println(" [x] Received '" + message + "'");
}
};

//6. 設置 Channel 消費者綁定隊列
channel.basicConsume(queueName, true, consumer);

}
}

/<code>
<code>Copy Send message : this is direct msg

[x] Received 'this is direct msg'

/<code>

Topic 模式#

可以使用通配符進行模糊匹配

  • 符號'#" 匹配一個或多個詞
  • 符號"*”匹配不多不少一個詞

例如:

  • 'log.#"能夠匹配到'log.info.oa"
  • "log.*"只會匹配到"log.erro“
RabbitMQ——最常用的三大模式

<code>Copyimport com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class TopicProducer {

public static void main(String[] args) throws Exception {
//1. 創建一個 ConnectionFactory 並進行設置
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setVirtualHost("/");
factory.setUsername("guest");
factory.setPassword("guest");

//2. 通過連接工廠來創建連接
Connection connection = factory.newConnection();

//3. 通過 Connection 來創建 Channel
Channel channel = connection.createChannel();

//4. 聲明
String exchangeName = "test_topic_exchange";
String routingKey1 = "item.update";
String routingKey2 = "item.delete";
String routingKey3 = "user.add";

//5. 發送
String msg = "this is topic msg";
channel.basicPublish(exchangeName, routingKey1, null, msg.getBytes());
channel.basicPublish(exchangeName, routingKey2, null, msg.getBytes());
channel.basicPublish(exchangeName, routingKey3, null, msg.getBytes());
System.out.println("Send message : " + msg);

//6. 關閉連接
channel.close();
connection.close();
}
}

/<code>
<code>Copyimport com.rabbitmq.client.*;
import java.io.IOException;

public class TopicConsumer {


public static void main(String[] args) throws Exception {
//1. 創建一個 ConnectionFactory 並進行設置
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setVirtualHost("/");
factory.setUsername("guest");
factory.setPassword("guest");
factory.setAutomaticRecoveryEnabled(true);
factory.setNetworkRecoveryInterval(3000);

//2. 通過連接工廠來創建連接
Connection connection = factory.newConnection();

//3. 通過 Connection 來創建 Channel
Channel channel = connection.createChannel();

//4. 聲明
String exchangeName = "test_topic_exchange";
String queueName = "test_topic_queue";
String routingKey = "item.#";
channel.exchangeDeclare(exchangeName, "topic", true, false, null);
channel.queueDeclare(queueName, false, false, false, null);

//一般不用代碼綁定,在管理界面手動綁定
channel.queueBind(queueName, exchangeName, routingKey);

//5. 創建消費者並接收消息
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope,
AMQP.BasicProperties properties, byte[] body)
throws IOException {
String message = new String(body, "UTF-8");
System.out.println(" [x] Received '" + message + "'");
}
};
//6. 設置 Channel 消費者綁定隊列
channel.basicConsume(queueName, true, consumer);

}
}

/<code>
<code>CopySend message : this is topc msg

[x] Received 'this is topc msg'
[x] Received 'this is topc msg'

/<code>

Fanout 模式#

不處理路由鍵,只需要簡單的將隊列綁定到交換機上發送到交換機的消息都會被轉發到與該交換機綁定的所有隊列上。Fanout交換機轉發消息是最快的。

RabbitMQ——最常用的三大模式

<code>Copyimport com.rabbitmq.client.*;
import java.io.IOException;


public class FanoutConsumer {
public static void main(String[] args) throws Exception {
//1. 創建一個 ConnectionFactory 並進行設置
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setVirtualHost("/");
factory.setUsername("guest");
factory.setPassword("guest");
factory.setAutomaticRecoveryEnabled(true);
factory.setNetworkRecoveryInterval(3000);

//2. 通過連接工廠來創建連接
Connection connection = factory.newConnection();

//3. 通過 Connection 來創建 Channel
Channel channel = connection.createChannel();

//4. 聲明
String exchangeName = "test_fanout_exchange";
String queueName = "test_fanout_queue";
String routingKey = "item.#";
channel.exchangeDeclare(exchangeName, "fanout", true, false, null);
channel.queueDeclare(queueName, false, false, false, null);

//一般不用代碼綁定,在管理界面手動綁定
channel.queueBind(queueName, exchangeName, routingKey);

//5. 創建消費者並接收消息
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope,
AMQP.BasicProperties properties, byte[] body)
throws IOException {
String message = new String(body, "UTF-8");
System.out.println(" [x] Received '" + message + "'");
}
};

//6. 設置 Channel 消費者綁定隊列
channel.basicConsume(queueName, true, consumer);
}
}

/<code>
<code>Copyimport com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class FanoutProducer {

public static void main(String[] args) throws Exception {
//1. 創建一個 ConnectionFactory 並進行設置
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setVirtualHost("/");
factory.setUsername("guest");
factory.setPassword("guest");

//2. 通過連接工廠來創建連接
Connection connection = factory.newConnection();

//3. 通過 Connection 來創建 Channel
Channel channel = connection.createChannel();

//4. 聲明
String exchangeName = "test_fanout_exchange";
String routingKey1 = "item.update";
String routingKey2 = "";
String routingKey3 = "ookjkjjkhjhk";//任意routingkey

//5. 發送
String msg = "this is fanout msg";
channel.basicPublish(exchangeName, routingKey1, null, msg.getBytes());
channel.basicPublish(exchangeName, routingKey2, null, msg.getBytes());
channel.basicPublish(exchangeName, routingKey3, null, msg.getBytes());
System.out.println("Send message : " + msg);

//6. 關閉連接
channel.close();
connection.close();
}
}

/<code>
<code>CopySend message : this is fanout msg

[x] Received 'this is fanout msg'
[x] Received 'this is fanout msg'
[x] Received 'this is fanout msg'



/<code>

出處:https://www.cnblogs.com/haixiang/p/10864339.html

本站使用「CC BY 4.0」創作共享協議,轉載請在文章明顯位置註明作者及出處。



分享到:


相關文章: