點對點模式:
一對一模式 一個生產者投遞消息給隊列,只能允許有一個消費者進行消費。
注意:如果消費集羣的話,會進行均攤消費。
配置類:
public class MQConnectionUtils {
// 創建新的MQ連接
public static Connection newConnection() throws IOException, TimeoutException {
// 1.創建連接工廠
ConnectionFactory factory = new ConnectionFactory();
// 2.設置連接地址
factory.setHost("127.0.0.1");
// 3.設置用戶名稱
factory.setUsername("guest");
// 4.設置用戶密碼
factory.setPassword("guest");
// 5.設置amqp協議端口號
factory.setPort(5672);
// 6.設置VirtualHost地址
factory.setVirtualHost("/sym");
Connection connection = factory.newConnection();
return connection;
}
}
生產消息者:
// 簡單隊列生產者
public class Producer {
// 隊列名稱
private static final String QUEUE_NAME = "sym";
public static void main(String[] args) throws IOException, TimeoutException {
// 1.創建一個新的連接
Connection connection = MQConnectionUtils.newConnection();
// 2.創建通道
Channel channel = connection.createChannel();
// 3.創建一個隊列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
channel.basicQos(1);
for (int i = 1; i <= 10; i++) {
// 4.創建msg
String msg = "sym_msg_" + i;
System.out.println("生產者投遞消息內容:" + msg);
// 5.生產者發送消息者
channel.basicPublish("", QUEUE_NAME, null, msg.getBytes());
}
// 關閉通道和連接
channel.close();
connection.close();
}
}
消費消息者:
public class Consumer1 {
// 隊列名稱
private static final String QUEUE_NAME = "sym";
public static void main(String[] args) throws IOException, TimeoutException {
System.out.println("消費者啓動....01");
// 1.創建一個新的連接
Connection connection = MQConnectionUtils.newConnection();
// 2.創建通道
final Channel channel = connection.createChannel();
// 3.消費者關聯隊列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
channel.basicQos(1);
DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
// 監聽獲取消息
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
String msg = new String(body, "UTF-8");
System.out.println("消費者獲取生產者消息:" + msg);
}
};
// 4.設置應答模式 如果爲true情況下 表示爲自動應答模式 false 表示爲手動應答
channel.basicConsume(QUEUE_NAME, true, defaultConsumer);
// // 關閉通道和連接
// channel.close();
// connection.close();
}
}
消費消息者二:
public class Consumer2 {
// 隊列名稱
private static final String QUEUE_NAME = "sym";
public static void main(String[] args) throws IOException, TimeoutException {
System.out.println("消費者啓動....02");
// 1.創建一個新的連接
Connection connection = MQConnectionUtils.newConnection();
// 2.創建通道
final Channel channel = connection.createChannel();
// 3.消費者關聯隊列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
channel.basicQos(1);
DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
// 監聽獲取消息
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
String msg = new String(body, "UTF-8");
System.out.println("消費者獲取生產者消息:" + msg);
}
};
// 4.設置應答模式 如果爲true情況下 表示爲自動應答模式 false 表示爲手動應答
channel.basicConsume(QUEUE_NAME, true, defaultConsumer);
// // 關閉通道和連接
// channel.close();
// connection.close();
}
}
當消費者從對列服務器中獲取消息時,會均攤消息對列裏的消息,假設生產者向消費對列發送10條消息,消息一和消息二各自消費5個
效果截圖:
先啓動兩個消費者,再啓動生產者: