一、介绍
工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。在后台运行的工作进程将弹出任务并组最终执行作业。当有多个工作线程时,这些工作线程将一起处理这些任务。
二、轮询分发消息(案例)
启动两个工作线程(消费者),一个消息发送线程(生产者)。
1、抽取工具类
public class RabbitMqUtil {
//得到一个连接的channel
public static Channel getChannel() throws IOException, TimeoutException {
//创建一个连接工厂
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.xxx.165");
factory.setUsername("admin");
factory.setPassword("123");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
return channel;
}
}
2、启动两个工作线程(这里使用idea)
public class Worker01 {
//队列名称
public static final String QUEUE_NAME = "hello";
//接收消息
public static void main(String[] args) throws IOException, TimeoutException {
Channel channel = RabbitMqUtil.getChannel();
//消息的接收
DeliverCallback deliverCallback = (consumerTag,message) ->{
System.out.println("接收到的消息"+new String(message.getBody()));
};
//消息接收被取消时,执行下面的内容
CancelCallback cancelCallback = consumerTag -> {
System.out.println(consumerTag+"消费者取消消费接口回调逻辑");
};
/**
* 消费者消费消息
* 参数介绍
* 1:消费哪个队列
* 2:消费成功之后是否要自动应答 true 代表的自动应答 false 代表手动应答
* 3:消费者未成功消费的回调
* 4:消费者取消消息的回调
*/
System.out.println("C2等待接收消息......");
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 = RabbitMqUtil.getChannel();
//队列声明
/**
* 生成一个队列
* 参数介绍
* 1:队列名称
* 2:队列里面的消息是否持久化(磁盘)默认情况下消息存储在内存中
* 3:该队列是否只提供一个消费者进行消费,是否进行消息共享,true 可以多个消费者消费 false 只能一个消费者消费
* 4:是否自动删除 最后一个消费者断开连接后 该队列是否自动删除 true 自动删除 false 不自动删除
* 5:其他参数
*/
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
//从控制台中接受消息
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){
String message = scanner.next();
/**
* 发送一个消息
* 1:发送到哪个交换机
* 2:路由的key值是哪个 本次是队列的名称
* 3:其他参数信息
* 4:发送消息的消息体
*/
channel.basicPublish("",QUEUE_NAME,null,message.getBytes());
System.out.println("消息发送完成:"+message);
}
}
}
4、测试