Springboot服务任务处理多并发线程池构造

需求:服务优化改造,最初服务设计为单并发处理任务,防止任务过多导致被访问服务资源占用异常。后续优化部分类型任务执行为多并发处理,最大化利用资源。

任务处理流程: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版权协议,转载请附上原文出处链接和本声明。