RabbitMq | spring實現點對點隊列(簡單隊列)

點對點模式:

一對一模式 一個生產者投遞消息給隊列,只能允許有一個消費者進行消費。
注意:如果消費集羣的話,會進行均攤消費。

配置類:

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個

效果截圖:

先啓動兩個消費者,再啓動生產者:
在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述

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