文档章节

ThreadPoolTaskScheduler手写任务调度

朝如青丝暮成雪
 朝如青丝暮成雪
发布于 07/11 18:52
字数 692
阅读 108
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

先贴一个自己写的demo把,原理其实就是这样的。

先记录一个东西,后续来研究:CronSequenceGenerator

报错:Cron expression must consist of 6 fields,这玩意支持6位不支持7位,真是XXXX,quartz支持,参见 https://my.oschina.net/uwith/blog/4395339

CronTrigger这个类可以将cron表达式转换成Date,可以查看schedule源码学到不少东西,下面代码就是转换成下一执行时间。

public Date nextExecutionTime(TriggerContext triggerContext)
@Slf4j
@RestController
public class HomeController {

    /**
     * 存储调度器信息,存在多线程安全问题,采用ConcurrentHashMap
     * 初始大小设定大于核心线程池数量3倍即可
     */
    private Map<Integer, ScheduledFuture> map = new ConcurrentHashMap<>(64);
    ThreadPoolTaskScheduler threadPoolTaskScheduler;

    public HomeController() {
        // 注意,此线程池使用DelayedWorkQueue()作为队列,此队列又是基于PriorityQueue,
        // 自己会根据表达式进行排序,可以查看schedule方法源码以及参数
        threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
        threadPoolTaskScheduler.initialize();
        // 线程池需做配置化
        threadPoolTaskScheduler.setPoolSize(64);
    }

    @RequestMapping("/home/index/{id}")
    public String add(@PathVariable Integer id, @RequestBody String cron) {
        // 添加一个去重复的操作
        if (map.containsKey(id)) {
            return "调度任务已添加成功";
        }
        ScheduledFuture future = threadPoolTaskScheduler.schedule(
                new Runnable() {
                    @Override
                    public void run() {
                        try {
                            // 触发进行记录日志
                            StopWatch watch = new StopWatch();
                            watch.start();
                            log.info(String.format("%s-调度器已触发,准备rpc调用", id));

                            // 这里执行具体的操作
                            Thread.sleep(1000);

                            //执行完成取消
                            Boolean cancelResult = cancel(id);
                            watch.stop();
                            log.info(String.format("%s-调度器rpc调用完成,耗时:%s", id, watch.getLastTaskTimeMillis()));
                        } catch (Exception ex) {
                            log.error(String.format("%s-调度器出现异常:%s,堆栈信息:%s", id, ex.getMessage(), ExceptionUtils.getStackTrace(ex)));
                        }
                    }
                }, new CronTrigger(cron));
        // 暂时缓存,用于控制
        map.put(id, future);
        return "调度任务已添加成功";
    }

    @RequestMapping("/home/cancel/{id}")
    public Boolean cancel(@PathVariable Integer id) {
        ScheduledFuture future = map.get(id);
        // mayInterruptIfRunning参数指明是否可以中断线程,
        // 注意如果写true那么该段代码执行完成,后续操作可能会被中断,比如下面的remove方法,可能执行不到
        Boolean result = future.cancel(true);
        // 然后移除缓存
        map.remove(id);
        return Boolean.TRUE;
    }

    @RequestMapping("/home/query/{id}")
    public String query(@PathVariable Integer id) {
        ScheduledFuture future = map.get(id);
        StringBuilder sb = new StringBuilder();
        sb.append(String.format("future.isCancelled%s</br>", future.isCancelled()));
        sb.append(String.format("future.isDone%s</br>", future.isDone()));
        return sb.toString();
    }

    @RequestMapping("/home/queryInfo")
    public String queryInfo() {
        StringBuilder sb = new StringBuilder();
        sb.append(String.format("getPoolSize%s</br>", threadPoolTaskScheduler.getPoolSize()));
        sb.append(String.format("getActiveCount%s</br>", threadPoolTaskScheduler.getActiveCount()));

        sb.append(String.format("getScheduledExecutor.isShutdown", threadPoolTaskScheduler.getScheduledExecutor().isShutdown()));
        sb.append(String.format("getScheduledExecutor.isTerminated%s</br>", threadPoolTaskScheduler.getScheduledExecutor().isTerminated()));

        sb.append(String.format("getScheduledThreadPoolExecutor.getPoolSize%s</br>", threadPoolTaskScheduler.getScheduledThreadPoolExecutor().getPoolSize()));
        sb.append(String.format("getScheduledThreadPoolExecutor.getCorePoolSize%s</br>", threadPoolTaskScheduler.getScheduledThreadPoolExecutor().getCorePoolSize()));
        sb.append(String.format("getScheduledThreadPoolExecutor.getLargestPoolSize%s</br>", threadPoolTaskScheduler.getScheduledThreadPoolExecutor().getLargestPoolSize()));
        sb.append(String.format("getScheduledThreadPoolExecutor.getMaximumPoolSize%s</br>", threadPoolTaskScheduler.getScheduledThreadPoolExecutor().getMaximumPoolSize()));
        sb.append(String.format("getScheduledThreadPoolExecutor.getActiveCount%s</br>", threadPoolTaskScheduler.getScheduledThreadPoolExecutor().getActiveCount()));
        sb.append(String.format("getScheduledThreadPoolExecutor.getTaskCount%s</br>", threadPoolTaskScheduler.getScheduledThreadPoolExecutor().getTaskCount()));
        sb.append(String.format("getScheduledThreadPoolExecutor.getCompletedTaskCount%s</br>", threadPoolTaskScheduler.getScheduledThreadPoolExecutor().getCompletedTaskCount()));
        sb.append(String.format("getScheduledThreadPoolExecutor.getQueue%s</br>", threadPoolTaskScheduler.getScheduledThreadPoolExecutor().getQueue().size()));
        sb.append(String.format("getScheduledThreadPoolExecutor.getKeepAliveTime%s</br>", threadPoolTaskScheduler.getScheduledThreadPoolExecutor().getKeepAliveTime(TimeUnit.SECONDS)));
        sb.append(String.format("getScheduledThreadPoolExecutor.isShutdown%s</br>", threadPoolTaskScheduler.getScheduledThreadPoolExecutor().isShutdown()));
        sb.append(String.format("getScheduledThreadPoolExecutor.isTerminating%s</br>", threadPoolTaskScheduler.getScheduledThreadPoolExecutor().isTerminating()));
        sb.append(String.format("getScheduledThreadPoolExecutor.isTerminated%s</br>", threadPoolTaskScheduler.getScheduledThreadPoolExecutor().isTerminated()));
        return sb.toString();
    }

}

 

 

 

朝如青丝暮成雪
粉丝 9
博文 229
码字总数 120182
作品 0
浦东
程序员
私信 提问
加载中
请先登录后再评论。
【opencv】图形的绘制

1.矩形图像的绘制: 原函数:void cvRectangle(CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness=1, int line_type=8,int shift=0) img就是需要绘制的图像 pt1 and pt......

其实我是兔子
2014/10/08
1.2K
1
服务器自动化任务解决方案--Huginn

Huginn 是雅虎开发的一个系统,可以帮你执行自动化的在线任务。可以阅读网页,关注事件,并采取相应操作。Huginn 通过一个直观的事件流图来展示各种操作和事件。通过在你自己的服务器上的管道加...

匿名
2013/03/15
1.7W
0
硬实时操作系统--Raw OS

Raw-OS 起飞于2012年,Raw-OS志在制作中国人自己的最优秀硬实时操作系统。 Raw-OS 操作系统特性 内核最大关中断时间无限接近0us, s3c2440系统最大关中断时间实测0.8us。 支持idle任务级别的事...

jorya_txj
2013/03/19
6.3K
1
并行编译工具--Icecream

Icecream 是由 SUSE 创建的、基于 distcc 的并行编译工具。可在远程机器上执行构建和分发、并行编译。与 distcc 不同的是,Icecream 使用一个中央服务器动态的对编译作业进行调度。...

匿名
2013/04/11
1.2K
1
高性能异步网络服务框架--libgod

libGod是一个全异步+协程机制实现的网络库,适用于windows、linux、bsd等多种平台。内部使用IOCP、epoll、kqueue等系统调用管理事件机制,同时巧妙的利用协程,将复杂的异步逻辑转换为同步,...

libGod
2012/11/09
6.8K
6

没有更多内容

加载失败,请刷新页面

加载更多

抖音批量发布软件,批量运营200+自媒体账号

抖音批量发布软件,批量运营200+自媒体账号,现在短视频平台大家也可以看的到,流量很大,很多人开通了商品橱窗,在上面进行带货,赚钱也很简单,尤其是抖音这个平台,男女老少都在玩,里面也...

osc_emgrwx5d
24分钟前
9
0
基于MES系统的企业信息化系统的集成

引言 随着网络和科技的发展,互联网技术和电子信息技术已经逐渐融入了我们生活工作的各个环节。在企业中,企业信息化程度的高低也直接影响到企业的运营。企业要想得到快速长远的发展,就要利...

osc_7owgvpdx
25分钟前
28
0
dockerfile源码编译安装nginx、php和harbor

安装docker 环境:基于CentOS Linux release 7.6.1810 注意:以下所有操作基于root用户 #centos7# step 1: 安装必要的一些系统工具yum install -y yum-utils device-mapper-persistent-da...

osc_otuqqtuq
26分钟前
13
0
条形码识别器Dynamsoft Barcode Reader v7.5全新上线!

Dynamsoft Barcode Readerv7.5带来了一些新的参数配置,例如中心定位条形码、二值化模式等。让我们来看看新功能中的一些亮点。 更新 添加了对QR Code Model 1(QR Code规范的旧版本)的支持。...

roffey
27分钟前
6
0
TCP端口的十一种连接状态

TCP端口的十一种连接状态∶ CLOSED∶端口默认是关闭状态。 
LISTEN∶服务器程序开始监听一个端口,就是LISTEN状态。 
 

SYN_RCVD∶三次握手的第二次握手后的端口状态,是收到了客户端发...

程序员面试吧
27分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部