在上一篇博客《RabbitMQ入门:Hello RabbitMQ 代码实例》中,我们通过指定的队列发送和接收消息,代码还算是比较简单的。
假设有这一些比较耗时的任务,按照上一次的那种方式,我们要一直等前面的耗时任务完成了之后才能接着处理后面耗时的任务,那要等多久才能处理完?别担心,我们今天的主角--工作队列就可以解决该问题。我们将围绕下面这个索引展开:
什么是工作队列
代码准备
循环分发
消息确认
公平分发
消息持久化
废话少说,直接展开。
一、什么是工作队列
工作队列--用来将耗时的任务分发给多个消费者(工作者),主要解决这样的问题:处理资源密集型任务,并且还要等他完成。有了工作队列,我们就可以将具体的工作放到后面去做,将工作封装为一个消息,发送到队列中,一个工作进程就可以取出消息并完成工作。如果启动了多个工作进程,那么工作就可以在多个进程间共享。
二、代码准备
生产者类:NewTask.java
public classNewTask {//队列名称
public static final String QUEUE_NAME = "TASK_QUEUE";//队列是否需要持久化
public static final boolean DURABLE = false;//需要发送的消息列表
public static final String[] msgs = {"task 1", "task 2", "task 3", "task 4", "task 5", "task 6"};public static voidmain(String[] args) {
ConnectionFactory factory= newConnectionFactory();
factory.setHost("localhost");
Connection connection= null;
Channel channel= null;try{//1.connection & channel
connection =factory.newConnection();
channel=connection.createChannel();//2.queue
channel.queueDeclare(QUEUE_NAME, DURABLE, false, false, null);//3.publish msg
for (int i = 0; i < msgs.length; i++) {
channel.basicPublish("", QUEUE_NAME, null, msgs[i].getBytes());
System.out.println("** new task ****:" +msgs[i]);
}
}catch(IOException e) {
e.printStackTrace();
}catch(TimeoutException e) {
e.printStackTrace();
}finally{if (channel != null) {try{
channel.close();
}catch(IOException e) {
e.printStackTrace();
}catch(TimeoutException e) {
e.printStackTrace();
}
}if (connection != null) {try{
connection.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
}
}
消费者类:Work.java
public classWork {public static voidmain(String[]