RabbitMQ—简单工作队列(WorkQueues)
引言
工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。在后台运行的工作进程将弹出任务并最终执行作业。当有多个工作线程时,这些工作线程将一起处理这些任务。
案例(轮询分发消息)
一个生产者,两个消费者
抽取工具类
public class RabbitMQUtils {
public static Channel getChannel() throws Exception {
// 创建连接工厂
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("localhost");
connectionFactory.setUsername("cjd");
connectionFactory.setPassword("123456");
// 创建连接和管道
Connection connection = connectionFactory.newConnection();
Channel channel = connection.createChannel();
return channel;
}
}
创建生产者
public class Task {
public static final String WORK_QUEQU_NAME = "hello";
public static void main(String[] args) throws Exception {
Channel channel = RabbitMQUtils.getChannel();
channel.queueDeclare(WORK_QUEQU_NAME,false,false,false,null);
String message = "workqueues";
for (int i = 0; i < 10; i++) {
channel.basicPublish("",WORK_QUEQU_NAME,null,(message+i).getBytes());
}
System.out.println("消息发送完成");
}
创建消费者
public class Worker01 {
public static final String WORK_QUEQU_NAME = "hello";
public static void main(String[] args) throws Exception {
Channel channel = RabbitMQUtils.getChannel();
channel.queueDeclare(WORK_QUEQU_NAME,false,false,false,null);
System.out.println("work2等待接收消息.........");
//推送的消息如何进行消费的接口回调
DeliverCallback deliverCallback=(consumerTag, delivery)->{
String message= new String(delivery.getBody());
System.out.println("消息已接收:"+ message);
};
//取消消费的一个回调接口 如在消费的时候队列被删除掉了
CancelCallback cancelCallback=(consumerTag)->{
System.out.println("消息消费被中断");
};
channel.basicConsume(WORK_QUEQU_NAME,true,deliverCallback,cancelCallback);
}
}
创建一个消费者,开启两个线程
启动并测试
小结
通过程序执行发现生产者发送 10个消息,消费者 1 和消费者 2 会轮询的接收消息