与简单模式相比,工作队列模式(Work Queue)多了一些消费者,该模式也使用direct交换机,应用于处理消息较多的情况。特点如下:
RabbitMQ的工作队列模式(Work Queues)也被称为任务队列模式,是一种用于处理分布式任务的工作模式。在这种模式下,多个消费者可以监听同一个队列,但每个消息只能被一个消费者处理。这种模式适用于分布式任务处理场景,多个消费者共享处理一组任务,从而提高系统的并发性能和吞吐量。
工作队列模式的特点如下:
工作队列模式适用于以下场景:
实现工作队列模式的基本步骤如下:
通过工作队列模式,RabbitMQ可以有效地实现分布式任务处理和负载均衡,提高系统的性能和可靠性。
和普通模式一样:
public class Producer {
public static void main(String[] args) throws IOException, TimeoutException {
// 1.创建链接工厂
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("192.168.66.100");
connectionFactory.setPort(5672);
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
connectionFactory.setVirtualHost("/");
// 2.建立连接
Connection connection = connectionFactory.newConnection();
// 3.建立信道
Channel channel = connection.createChannel();
/**
* 4.创建队列,如果队列已存在,则使用该队列
* 参数1:队列名
* 参数2:是否持久化,true表示MQ重启后队列还在。
* 参数3:是否私有化,false表示所有消费者都可以访问,true表示只有第一次拥有它的消费者才能访问
* 参数4:是否自动删除,true表示不再使用队列时自动删除队列
* 参数5:其他额外参数
*/
channel.queueDeclare("work_queue",true,false,false,null);
// 5.发送大量消息
for (int i=1; i<=100; i++){
/**
* 参数1:交换机名,""表示默认交换机
* 参数2:路由键,简单模式就是队列名
* 参数3:表示该消息为持久化消息,即除了保存到内存还会保存到磁盘中
* 参数4:要传递的消息字节数组
*/
channel.basicPublish("","work_queue", MessageProperties.PERSISTENT_TEXT_PLAIN,("你好这是第"+i+"消息").getBytes());
}
// 6.关闭信道和连接
channel.close();
connection.close();
System.out.println("--- 发送成功 ---");
}
}
运行成功如下图:
这里我们可以编写三个消费者,查看他们获取的消息
public class Producer {
public static void main(String[] args) throws IOException, TimeoutException {
// 1.创建链接工厂
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("192.168.66.100");
connectionFactory.setPort(5672);
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
connectionFactory.setVirtualHost("/");
// 2.建立连接
Connection connection = connectionFactory.newConnection();
// 3.建立信道
Channel channel = connection.createChannel();
/**
* 4.创建队列,如果队列已存在,则使用该队列
* 参数1:队列名
* 参数2:是否持久化,true表示MQ重启后队列还在。
* 参数3:是否私有化,false表示所有消费者都可以访问,true表示只有第一次拥有它的消费者才能访问
* 参数4:是否自动删除,true表示不再使用队列时自动删除队列
* 参数5:其他额外参数
*/
channel.queueDeclare("work_queue",true,false,false,null);
// 5.发送大量消息
for (int i=1; i<=100; i++){
/**
* 参数1:交换机名,""表示默认交换机
* 参数2:路由键,简单模式就是队列名
* 参数3:表示该消息为持久化消息,即除了保存到内存还会保存到磁盘中
* 参数4:要传递的消息字节数组
*/
channel.basicPublish("","work_queue", MessageProperties.PERSISTENT_TEXT_PLAIN,("你好这是第"+i+"消息").getBytes());
}
// 6.关闭信道和连接
channel.close();
connection.close();
System.out.println("--- 发送成功 ---");
}
}
运行后如下图:
消费者1如下图:
消费者2如下图:
消费者3如下图:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。