需求:服务优化改造,最初服务设计为单并发处理任务,防止任务过多导致被访问服务资源占用异常。后续优化部分类型任务执行为多并发处理,最大化利用资源。
任务处理流程:executerTask->taskMap.put(taskId,task)->schedule.scheduleAtFixedRate(execute)->getTask(WaitTask)->taskRun
任务触发-任务保存至内存Map(或者redis队列)-轮询服务每隔一段时间获取任务(本地内存Map根据任务状态获取任务,或redis队列获取任务)-获取到的任务和状态map匹配一致后触发执行,状态map获取对应任务为stop或remove则不做任何处理
初始版本任务处理ScheduleJob
package com.demo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@Service
@Slf4j
public class EvalScheduleJob {
private static ScheduledExecutorService scheduleTask = new ScheduledThreadPoolExecutor(1,
new BasicThreadFactory.Builder().namingPattern("schedule-eval-task-%d").daemon(true).build());
@PostConstruct
public void init() {
// 任务轮询
scheduleTask.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
// 进入执行逻辑
execute();
}
}, 0, 3, TimeUnit.SECONDS);
}
}
更新版本任务处理ExecutorService
private BlockingQueue<Runnable> workQueue;
private ExecutorService executor;
@PostConstruct
public void init() {
// 队列长度为100,超过100个等待任务新增任务抛出异常无法新增任务
workQueue = new LinkedBlockingQueue<Runnable>(100);
// 常驻线程5,队列长度100,超过105待执行任务后扩大至10并发线程,超过110待执行任务后新增任务抛出异常
executor = new ThreadPoolExecutor(5,
10,
0L, TimeUnit.SECONDS,
workQueue, new ThreadFactoryBuilder().setNameFormat("eval-task-pool-%d").build(),
new ThreadPoolExecutor.AbortPolicy());
}版权声明:本文为as57147原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。