簡單隊列
功能:一個生產者P發送消息到隊列Q,一個消費者C接收
P表示爲生產者 、C表示爲消費者 紅色表示隊列。
Maven
<dependencies>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>3.6.5</version>
</dependency>
</dependencies>
封裝Connection
public class MQConnectionUtils {
public static Connection newConnection() throws IOException, TimeoutException {
// 1.定義連接工廠
ConnectionFactory factory = new ConnectionFactory();
// 2.設置服務器地址
factory.setHost("127.0.0.1");
// 3.設置協議端口號
factory.setPort(5672);
// 4.設置vhost
factory.setVirtualHost("/test001_host");
// 5.設置用戶名稱
factory.setUsername("test001");
// 6.設置用戶密碼
factory.setPassword("123456");
// 7.創建新的連接
Connection newConnection = factory.newConnection();
return newConnection;
}
}
生產者
public class Producer {
private static final String QUEUE_NAME = "test_queue";
public static void main(String[] args) throws IOException, TimeoutException {
// 1.獲取連接
Connection newConnection = MQConnectionUtils.newConnection();
// 2.創建通道
Channel channel = newConnection.createChannel();
// 3.創建隊列聲明
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
String msg = "test_yushengjun110";
System.out.println("生產者發送消息:" + msg);
// 4.發送消息
channel.basicPublish("", QUEUE_NAME, null, msg.getBytes());
channel.close();
newConnection.close();
}
}
消費者
public class Customer {
private static final String QUEUE_NAME = "test_queue";
public static void main(String[] args) throws IOException, TimeoutException {
System.out.println("002");
// 1.獲取連接
Connection newConnection = MQConnectionUtils.newConnection();
// 2.獲取通道
Channel channel = newConnection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
String msgString = new String(body, "UTF-8");
System.out.println("消費者獲取消息:" + msgString);
}
};
// 3.監聽隊列
channel.basicConsume(QUEUE_NAME, true, defaultConsumer);
}
}
工作隊列
生產者
public class Producer {
private static final String QUEUE_NAME = "test_queue";
public static void main(String[] args) throws IOException, TimeoutException {
// 1.獲取連接
Connection newConnection = MQConnectionUtils.newConnection();
// 2.創建通道
Channel channel = newConnection.createChannel();
// 3.創建隊列聲明
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
channel.basicQos(1);// 保證一次只分發一次 限制發送給同一個消費者 不得超過一條消息
for (int i = 1; i <= 50; i++) {
String msg = "test_yushengjun" + i;
System.out.println("生產者發送消息:" + msg);
// 4.發送消息
channel.basicPublish("", QUEUE_NAME, null, msg.getBytes());
}
channel.close();
newConnection.close();
}
}
消費者
public class Customer1 {
private static final String QUEUE_NAME = "test_queue";
public static void main(String[] args) throws IOException, TimeoutException {
System.out.println("001");
// 1.獲取連接
Connection newConnection = MQConnectionUtils.newConnection();
// 2.獲取通道
final Channel channel = newConnection.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 msgString = new String(body, "UTF-8");
System.out.println("消費者獲取消息:" + msgString);
try {
Thread.sleep(1000);
} catch (Exception e) {
} finally {
// 手動回執消息
channel.basicAck(envelope.getDeliveryTag(), false);
}
}
};
// 3.監聽隊列
channel.basicConsume(QUEUE_NAME, false, defaultConsumer);
}
}