仅仅是个思路,大佬有更好的实现方法,欢迎评论区留言。
工具类:
@Data
public class ExcelExportQueue {
private LinkedList<Runnable> queue;
private int maxLength;
// 可调整线程数
@Resource
private UserMapper userMapper;
//构造一个限定长度的队列,实际上是一个链表
public ExcelExportQueue(int maxLength) {
this.queue = new LinkedList<>();
this.maxLength = maxLength;
}
// 处理请求
public void processRequests() {
// 创建线程池
ExecutorService executorService = Executors.newFixedThreadPool(3);
Runnable task;
// 模拟请求处理
while (!queue.isEmpty()) { // 检查任务队列是否为空
task = queue.poll(); // 从队列中移除并返回一个任务,如果队列为空则返回 null
if (task != null) { // 确认是否成功获取到任务
System.out.println("正在执行任务: " + task);
executorService.submit(task); // 将任务提交给线程池执行
}
System.out.println("请求 " + task + " 处理完成。");
}
}
服务实现:
@Service
public class UserServiceImpl implements UserService {
@Resource
private UserMapper userMapper;
private Queue<Runnable> taskQueue = new LinkedBlockingQueue<>();
private ExecutorService executorService = Executors.newFixedThreadPool(10); // 可调整线程数
//模拟导出User表
public void exportUsersToExcel(String filePath) {
List<User> userList = new ArrayList<>();
userList = userMapper.selectAll();
EasyExcel.write(filePath, User.class).sheet("用户信息").doWrite(userList);
System.out.println("导出完成: " + filePath);
}
//将请求加入请求处理队列,如果队列满了,之后的请求将无法进入队列,提示加入队列失败
@Override
public boolean addRequest(ExcelExportQueue exportQueue,String request) {
LinkedList<Runnable> queue = exportQueue.getQueue();
if (exportQueue.getQueue().size() < exportQueue.getMaxLength()) {
Runnable task = () -> exportUsersToExcel(request);
System.out.println("添加任务: " + request);
queue.add(task);
exportQueue.setQueue(queue);
System.out.println("请求 " + request + " 已加入队列。");
return true;
} else {
System.out.println("请求 " + request + " 进入队列失败,请稍后再试。");
return false;
}
}
}
请求测试:
@Resource
private UserService userService;
@PostMapping("/getUserExcel")
public void getUserExcel() {
ExcelExportQueue exportQueue = new ExcelExportQueue(5);
// 模拟添加请求
for (int i = 1; i <= 7; i++) { // 试图添加7个请求
userService.addRequest(exportQueue,"export_user_" + i + ".xlsx");
System.out.println("导出请求 " + i);
}
// 处理队列中的请求
exportQueue.processRequests();
}
测试效果: