文章目录
一、工作队列 Work Queues
Simple队列是生产者与消费者一对一的关系。在实际开发中,我们经常遇到多个消费者,我们可以想象,生产者发送消息是毫不费力的,然而消费者获取消息通常还需要进行一系列的业务处理,这显然需要一段时间,这时候消息队列可能就会积压很多消息。
实验代码:轮询分发
实验: 创建两个消费者,消费者1每隔2s接收并处理一次消息,消费者2每隔1s接收并处理一次消息。
查看结果:消费者1和消费者2轮询接收消息,并没有出现谁多处理了一个,谁少处理了一个的现象。
Send
/**
* 工作队列的生产者
*/
public class Send {
public static final String QUEUE_NAME = "test_work_queue";
public static void main(String[] args) throws IOException, InterruptedException {
// 获取连接
Connection connection = ConnectionUtils.getConnection();
// 创建一个通道
Channel channel = connection.createChannel();
// 声明一个队列
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
// 连续发送消息
for (int i =0; i < 30; i++){
String msg = "Hello Work Queues :"+i;
channel.basicPublish("",QUEUE_NAME,null,msg.getBytes());
System.out.println("Send Msg : "+i);
Thread.sleep(i*20);
}
// 释放连接
channel.close();
connection.close();
}
}
Receive01
/**
* 工作队列 消费者1获得消息
*/
public class Receive01 {
public static final String QUEUE_NAME = "test_work_queue";
public static void main(String[] args) throws IOException {
// 获取连接
Connection connection = ConnectionUtils.getConnection();
// 创建一个通道
Channel channel = connection.createChannel();
// 声明一个队列
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
// 定义一个消费者
DefaultConsumer consumer = new DefaultConsumer(channel){
// 获取消息的回调函数
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String msg = new String(body,"utf-8");
System.out.println("[1] Receive Msg : "+msg);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
System.out.println("[1] done ");
}
}
};
boolean autoAck = true;
channel.basicConsume(QUEUE_NAME,autoAck,consumer);
}
}
Receive02
/**
* 工作队列 消费者2获得消息
*/
public class Receive02 {
public static final String QUEUE_NAME = "test_work_queue";
public static void main(String[] args) throws IOException {
// 获取连接
Connection connection = ConnectionUtils.getConnection();
// 创建一个通道
Channel channel = connection.createChannel();
// 声明一个队列
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
// 定义一个消费者
DefaultConsumer cons