5、Work Queues 轮询
工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。
相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。
在后台运行的工作进程将弹出任务并最终执行作业。
当有多个工作线程时,这些工作线程将一起处理这些任务。工作进程就相当于消费者
RabbitMQ 工作时会采取轮询机制完成消息消费,保证每个消息都会被消费并且只被消费一次,消费者之间是竞争关系,轮流抢夺消费信息。
开启两个工作进程,由一个生产者发送大量消息,观察轮询机制
Worker
public class Worker01 {
public static void main(String[] args) throws IOException, TimeoutException {
Channel channel = CommonUtil.getChannel("192.168.126.129", "3aniuma", "123456");
DeliverCallback deliverCallback = (consumerTag, message)->{
System.out.println("接收到的消息:"+new String(message.getBody()));
};
CancelCallback cancelCallback = (consumerTag)->{
System.out.println("消息消费被中断");
};
System.out.println("Worker03等待接收消息");
channel.basicConsume("hello",true,deliverCallback,cancelCallback);
}
}
开启两个工作线程,选一个before launch task[为了在你切换线程之间做修改及时编译,默认不自动编译],再选一个 Allow multiple instances 【这个就是表示开启这个程序允许开多线程】
task
public class Task01 {
public static void main(String[] args) throws IOException, TimeoutException {
Channel channel = CommonUtil.getChannel("192.168.126.129","3aniuma","123456");
/**
* 生成一个队列
* 参数
* 1.队列名称
* 2.队列里面的消息是否持久化 默认消息存储在内存中
* 3.该队列是否只供一个消费者进行消费 是否进行共享 true 可以多个消费者消费
* 4.是否自动删除 最后一个消费者端开连接以后 该队列是否自动删除 true 自动删除
* 5.其他参数
*/
channel.queueDeclare("hello",false,false,false,null);
/**
* 发送一个消息
* 1.发送到那个交换机
* 2.路由的 key 是哪个
* 3.其他的参数信息
* 4.发送消息的消息体
*/
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()){
String message = scanner.next();
channel.basicPublish("","hello",null,message.getBytes(StandardCharsets.UTF_8));
System.out.println(message+"消息发送完毕!!");
}
}
}
观察运行结果可以发现,工作线程【消费者】们之间遵循轮询消费机制,你一个我一个的接受消息
版权声明:本文为m0_55668855原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。