釋出訂閱模式
圖解
具體實現
- 型別 fanout
- 特點 Fanout-釋出訂閱模式,是一種廣播機制,它是沒有路由 key 的模式
生產者程式碼
public class Producer {
public static void main(String[] args) {
// 所有的中介軟體技術都是基於 TCP/IP 協議基礎之上構建的協議規範,只不過 rabbitmq 遵循的是 AMQP 協議
// ip port
// 1 建立連線工廠
ConnectionFactory connectionFactory = new ConnectionFactory();
// 2 設定連線屬性
connectionFactory.setHost("192.168.33.180");
connectionFactory.setPort(5672);
connectionFactory.setUsername("admin");
connectionFactory.setPassword("szy10086");
connectionFactory.setVirtualHost("/");
Connection connection = null;
Channel channel = null;
try {
// 3 從連線工廠中獲取連線 Connection
connection = connectionFactory.newConnection("生產者");
// 4 通過連線獲取通道 Channel
channel = connection.createChannel();
// 5 準備傳送訊息的內容
String message = "This is a routing message";
// 6 準備交換機
String exchangeName = "fanout-exchange";
// 7 定義路由 key
String routingKey = "";
// 8 指定交換機型別
String type = "fanout";
// 7 傳送訊息給佇列 queue
/*
* @param1:交換機名稱
* @param2:佇列名稱/routingKey
* @param3:屬性配置
* @param4:傳送訊息的內容
* #.course.* queue3...
*/
channel.basicPublish(exchangeName,routingKey,null,message.getBytes());
System.out.println("傳送訊息成功");
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
} finally {
// 7 關閉通道
if (channel!= null && channel.isOpen()) {
try {
channel.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
// 8 關閉連線
if (connection != null && connection.isOpen()) {
try {
connection.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
消費者程式碼
public class Consumer {
public static Runnable runnable = new Runnable() {
public void run() {
// 所有的中介軟體技術都是基於 TCP/IP 協議基礎之上構建的協議規範,只不過 rabbitmq 遵循的是 AMQP 協議
// ip port
// 1 建立連線工廠
ConnectionFactory connectionFactory = new ConnectionFactory();
// 2 設定連線屬性
connectionFactory.setHost("192.168.33.180");
connectionFactory.setPort(5672);
connectionFactory.setUsername("admin");
connectionFactory.setPassword("szy10086");
connectionFactory.setVirtualHost("/");
// 獲取佇列的名稱
final String queueName = Thread.currentThread().getName();
Connection connection = null;
Channel channel = null;
try {
// 3 從連線工廠中獲取連線
connection = connectionFactory.newConnection("生產者");
// 4 通過連線獲取通道 Channel
channel = connection.createChannel();
// 5 宣告佇列 queue 儲存訊息
/*
* 如果佇列不存在,則會建立
* RabbitMQ 不允許建立兩個相同的佇列名稱,否則會報錯
*
* @param1:queue 佇列的名稱
* @param2:durable 佇列是否持久化
* @param3:exclusive 是否排他,即是否私有,如果為 true,會對當前佇列加鎖,其它通道不能訪問,並且連線自動關閉
* @param4:autoDelete 是否自動刪除,當最後一個消費者斷開連線之後是否自動刪除訊息
* @param5:arguments 可以設定佇列附加引數,設定佇列的有效期,訊息的最大長度,佇列的訊息生命週期等等。
*/
Channel finalChannel = channel;
finalChannel.basicConsume(queueName, true, new DeliverCallback() {
public void handle(String s, Delivery delivery) throws IOException {
System.out.println(delivery.getEnvelope().getDeliveryTag());
System.out.println(queueName+":收到訊息是:\t" + new String(delivery.getBody(), "UTF-8"));
}
}, new CancelCallback() {
public void handle(String s) throws IOException {
System.out.println("接收失敗");
}
});
System.out.println(queueName+":開始接收訊息");
// System.in.read();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
} finally {
// 7 關閉通道
if (channel!= null && channel.isOpen()) {
try {
channel.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
// 8 關閉連線
if (connection != null && connection.isOpen()) {
try {
connection.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
};
public static void main(String[] args) {
// 啟動三個執行緒去執行
new Thread(runnable,"queue1").start();
new Thread(runnable,"queue2").start();
}
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結