RabbitMQ簡單隊列

自動應答:  均攤

手動應答:     能者多勞


獲取一個連接

package com.haitao.rabbit;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class MQConnectionUtils {

	// 創建新的MQ連接
	public static Connection newConnection() throws IOException, TimeoutException {
		
		// 創建連接工廠
		ConnectionFactory factory = new ConnectionFactory();
		
		
		// 設置連接地址
		factory.setHost("127.0.0.1");
		// 設置amqp協議端口號
		factory.setPort(5672);
		
		
		// 設置用戶名稱
		factory.setUsername("xuhaitao");
		// 設置用戶密碼
		factory.setPassword("123456");

		
		// 設置VirtualHost地址
		factory.setVirtualHost("/my");
		Connection connection = factory.newConnection();
		return connection;
	}
}

生產者:

package com.haitao.rabbit;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

// 簡單隊列生產者
public class Producer {

	// 隊列名稱
	private static final String QUEUE_NAME = "queue01";

	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 <= 50; i++) {
			// 4.創建msg
			String msg = "msg_" + i;
			// System.out.println("生產者投遞消息內容:" + msg);
			// 5.生產者發送消息者
			channel.basicPublish("", QUEUE_NAME, null, msg.getBytes());
		}

		// 關閉通道和連接
		channel.close();
		connection.close();
	}

}

消費者(自動應答):

package com.haitao.rabbit;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.AMQP.BasicProperties;

public class Consumer1 {
	// 隊列名稱
	private static final String QUEUE_NAME = "queue01";

	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);
			}
		};
		// 設置應答模式 如果爲true情況下 表示爲自動應答模式
		channel.basicConsume(QUEUE_NAME, true, defaultConsumer);
		// // 關閉通道和連接
		// channel.close();
		// connection.close();
	}
}

消費者(主動應答):

package com.haitao.rabbit;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.AMQP.BasicProperties;

public class Consumer2 {
	// 隊列名稱
	private static final String QUEUE_NAME = "queue01";

	public static void main(String[] args) throws IOException, TimeoutException {
		System.out.println("消費者啓動....02");
		// 創建一個新的連接
		Connection connection = MQConnectionUtils.newConnection();
		// 創建通道
		final Channel channel = connection.createChannel();
		// 消費者關聯隊列
		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);
				try {
					// 模擬應答等待時間
					Thread.sleep(500);
				} catch (Exception e) {
					// TODO: handle exception
				} finally {
					// 手動告訴給隊列服務器,已經處理成功
					 channel.basicAck(envelope.getDeliveryTag(), false);
				}
			}
		};
		// 設置應答模式 如果爲false表示爲手動應答
		channel.basicConsume(QUEUE_NAME, false, defaultConsumer);
		// // 關閉通道和連接
		// channel.close();
		// connection.close();
	}
}

 

FR:徐海濤(hunk Xu)
QQ技術交流羣:386476712

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