工作队列的含义
工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。
相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。在后台运行的工作进程将弹出任务并最终执行作业。当有多个工作线程时,这些工作线程将一起处理这些任务。
轮询消费的含义
每个工作队列都会获取一个消息进行消费,并且获取的次数按照顺序一次往下轮流
一个消费者就是一个工作队列,启动两个工作队列消费消息,这个两个工作队列会以轮询的方式消费消息。
轮询案例
- 1.将创建信道封装成一个工具类RabbitMqUtils
public class RabbitMqUtils {
public static Channel getChannel() throws Exception{
//创建一个连接工厂
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.3.129");
factory.setUsername("admin");
factory.setPassword("123");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
return channel;
}
}
- 2.创建两个工作队列
public class Work01 {
//队列的名称
public static final String QUEUE_NAME="hello";
//接收消息
public static void main(String[] args) throws IOException, TimeoutException {
Channel channel = RabbitMQUtils.getChannel();
//消息的接受
DeliverCallback deliverCallback = (consumerTag,message) ->{
System.out.println("接收到的消息:"+new String(message.getBody()));
};
//消息接受被取消时,执行下面的内容
CancelCallback cancelCallback = consumerTag -> {
System.out.println(consumerTag+"消息被消费者取消消费接口回调逻辑");
};
//消息的接受
channel.basicConsume(QUEUE_NAME,true,deliverCallback,cancelCallback);
}
}
- 3.创建一个生产者,发送消息
public class Task01 {
//队列名称
public static final String QUEUE_NAME="hello";
//发送大量消息
public static void main(String[] args) throws IOException, TimeoutException {
Channel channel = RabbitMQUtils.getChannel();
//队列的声明
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
//发送消息
//从控制台当中接受信息
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String message = scanner.next();
channel.basicPublish("",QUEUE_NAME,null,message.getBytes());
System.out.println("消息发送完成:"+message);
}
}
}
- 结果展示