WorkQueues模式
Work Queues:与入门程序的简单模式相比,多了一个或者一些消费者,多个消费端共同消费同一个队列中的消息
应用场景:对于任务过重或任务较多情况使用工作队列可以提高任务处理的速度
生产者代码
package com.workqueues;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
/**
* work_queues
*
* @date 2023-02-19 20:47
*/
public class WorkQueuesProductor {
private final static String QUEUE_NAME = "work_queues";
public static void main(String[] args) {
// 1、创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 2、设置一些参数
factory.setHost("192.168.1.25"); // ip默认值localhost
factory.setPort(5672);
factory.setUsername("admin");
factory.setPassword("123456");
factory.setVirtualHost("/itcast");
// 3、获取对应的连接
Connection connection = null;
Channel channel = null;
try {
connection = factory.newConnection();
channel = connection.createChannel();
/**
* 生成一个队列
* 1.队列名称 queue
* 2.队列里面的消息是否持久化 默认消息存储在内存中 durable
* 3.该队列是否只供一个消费者进行消费 是否进行共享 true 可以多个消费者消费 exclusive 当消费结束后是否可以删除队列
* 4.是否自动删除 最后一个消费者端开连接以后 该队列是否自动删除 true 自动删除 autoDelete 没有consumer时
* 5.其他参数
*/
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
for (int i = 1; i <= 100000; i++) {
String message = "hello word >>>>> " + i;
/**
* 发送一个消息
* 1.发送到那个交换机 exchange 简单模式下,使用默认交换器,设置为 ""
* 2.路由的 key 是哪个 routingKey 简单模式下,路由键与队列名称相同
* 3.其他的参数信息 props 配置信息
* 4.发送消息的消息体 body 发送的信息
*/
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (channel != null) {
channel.close();
}
if (connection != null) {
connection.close();
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("消息发送完毕");
}
}
}
消费者代码
消费者一(消费者二代码与之一致)
package com.workqueues;
import com.rabbitmq.client.*;
import java.io.IOException;
/**
* work_queues consumer1
*
* @date 2023-02-19 20:48
*/
public class WorkQueuesConsumer1 {
private final static String QUEUE_NAME = "work_queues";
public static void main(String[] args) {
// 1、创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 2、设置一些参数
factory.setHost("192.168.1.25"); // ip默认值localhost
factory.setPort(5672);
factory.setUsername("admin");
factory.setPassword("123456");
factory.setVirtualHost("/itcast");
// 3、获取对应的连接
Connection connection = null;
Channel channel = null;
try {
connection = factory.newConnection();
channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String va1 = new String(delivery.getBody());
System.out.println(va1);
};
CancelCallback cancelCallback = (consumerTag) -> {
System.out.println("消息消费被中断");
};
/**
* 消费者消费消息
* 1.消费哪个队列
* 2.消费成功之后是否要自动应答 true 代表自动应答 false 手动应答
* 3.消费者未成功消费的回调
*/
channel.basicConsume(QUEUE_NAME, true, deliverCallback, cancelCallback);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("消费者不关闭资源");
}
}
}