rabbitmq工作模式
rabbitmq工作模式
一个生产者发送消息给多个消费者
工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。在后台运行的工作进程将弹出任务并最终执行作业。当有多个工作线程时,这些工作线程将一起处理这些任务
代码实现
消费者
package com.yl.workqueue;
import com.rabbitmq.client.CancelCallback;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DeliverCallback;
import com.yl.util.RabbitConstant;
import com.yl.util.RabbitUtils;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* 消息消费者
*
* @author Y-wee
*/
public class Consumer {
public static void main(String[] args) throws IOException, TimeoutException {
Connection connection = RabbitUtils.getConnection();
Channel channel = connection.createChannel();
// 不公平分发,取消轮询机制,谁先处理完就把未处理的消息分配给谁,能者多劳(默认是轮询)
channel.basicQos(1);
channel.queueDeclare(RabbitConstant.QUEUE_WORK, false, false, false, null);
// 通过传参模拟多个消费者
System.out.println("消费者"+args[0]+"开始工作");
DeliverCallback deliverCallback = (consumerTag, message) -> {
System.out.println("接收到消息:"+new String(message.getBody()));
channel.basicAck(message.getEnvelope().getDeliveryTag(),false);
};
CancelCallback cancelCallback = (consumerTag) -> {
System.out.println("消费失败");
};
channel.basicConsume(RabbitConstant.QUEUE_WORK, false, deliverCallback, cancelCallback);
}
}
RabbitUtils是笔者自定义的一个工具类,用来获取连接
RabbitConstant是笔者自定义的一个常量类,里面存储了队列名和交换机名
生产者
package com.yl.workqueue;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.yl.util.RabbitConstant;
import com.yl.util.RabbitUtils;
import java.io.IOException;
import java.util.Scanner;
import java.util.concurrent.TimeoutException;
/**
* 消息生产者
*
* @author Y-wee
*/
public class Provider {
public static void main(String[] args) throws IOException, TimeoutException {
Connection connection = RabbitUtils.getConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(RabbitConstant.QUEUE_WORK, false, false, false, null);
// 通过控制台多次输入模拟发送多条消息
System.out.println("请输入要发送的消息:");
Scanner scanner=new Scanner(System.in);
while (scanner.hasNext()){
String message=scanner.next();
channel.basicPublish("", RabbitConstant.QUEUE_WORK, null, message.getBytes());
System.out.println("消息发送成功");
}
}
}
记得快乐
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!