自動應答: 均攤
手動應答: 能者多勞
獲取一個連接
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