最近在项目中遇到了一个问题, 对于新建的活动, 活动设置了开始时间和结束时间, 也就是数据库中的一个状态码的改变而已. 但是,这里就有问题了, 如何去实现到时间更改活动状态呢?

1. 刚开始的时候,我想了下定时任务, 但是怎么也想不出配置的时间问题,  对于活动来说, 配置的定时任务肯定是有延迟的, 这就导致了时间到了,但是活动还未开始或者结束. 
2. 后来在万般苦思之后,相处了一个笨方法,就是在外部调用的每个接口前面加上了一个方法来处理活动的开始和结束,这样的话接口查询到的就是正常的开始或者结束的数据,但是页面上显示的活动还是有延时.本来已近结束,但是页面显示进行中.这样也会出现问题,即可能会被投诉虚假活动.

3.终于在被主管骂了一顿之后,才得知,在juc包中还有定时器这么个方法, 即创建一个定时的线程,利用ScheduledExecutorService 去定时执行,这样就会在指定时间更改活动状态,这样任务就算圆满完成,下面附上部分代码,以作备忘

//执行定时对象池
private ScheduledExecutorService scheduleExecutor = Executors.newScheduledThreadPool(2); //所有的定时任务
@SuppressWarnings("rawtypes")
private Map<String, List<Future>> currentJob = new HashMap<>(); /**
* 添加启动定时任务
* @param id
* @param millSecond
* @param clearFlag
* @return
*/
@SuppressWarnings("rawtypes")
public synchronized Future addStartJob(String id, Long millSecond, boolean clearFlag) {
if (clearFlag) {
//清除任务
clearJobsById(id);
}
if (null == currentJob.get(id)) {
currentJob.put(id, new ArrayList<>());
} ScheduledFuture<?> scheduledFuture = scheduleExecutor.schedule(new Runnable() {
@Override
public void run() {
logger.debug("/r/n 活动定时生效 活动ID: " + id + "时间: " + millSecond);
try {
startTask(id);
} catch (Exception e) {
e.printStackTrace();
logger.error(e.getMessage(), e.fillInStackTrace());
}
}
}, millSecond, TimeUnit.MILLISECONDS);
//加入集合
currentJob.get(id).add(scheduledFuture); return null;
}
/**
* 通过id清除任务
* @param id
*/
public void clearJobsById(String id) {
if (null != currentJob.get(id)) {
for (@SuppressWarnings("rawtypes") Future future : currentJob.get(id)) {
if (null != future && !future.isDone()) {
future.cancel(false); //正在运行是否干扰
}
}
currentJob.remove(id);
}
logger.debug("/r/n 活动清除定时任务! 任务ID: " + id);
currentJob.put(id, new ArrayList<>());
} }
 

SpringBoot实现定时器定时处理任务的更多相关文章

  1. 关于springboot的定时器配置

    关于springboot的定时器: 比较重要的两个注解: @EnableScheduling:标注启动定时任务. @Scheduled(fixedRate = 1000 * 30)  定义某个定时任务 ...

  2. 实现定时器定时 1 秒钟,LED 亮灭显示

    实现定时器定时 1 秒钟,LED 亮灭显示 要求 每隔一秒钟,实现LED灯的显隐转换 实验代码 /*************************************************** ...

  3. 关于给springboot添加定时器的两种方式

    原文:https://blog.csdn.net/liboyang71/article/details/72781526 首先,搭建好一个springboot项目,可使用maven或者gradle或者 ...

  4. Stm32 定时器 定时时间设置及PWM频率 占空比的设置总结

    一.定时器的时钟: 当SYSCLK等于72M,APB1等于36M APB2等于72M时,定时器的时钟为72M.注意图中这句话:如果APB1/APB2预分频器=1则频率不变,否则频率x2.如果此时,AP ...

  5. Springboot+websocket+定时器实现消息推送

    由于最近有个需求,产品即将到期(不同时间段到期)时给后台用户按角色推送,功能完成之后在此做个小结 1. 在启动类中添加注解@EnableScheduling package com.hsfw.back ...

  6. STM32——TIM2定时器定时

    STM32 中一共有11 个定时器,其中2 个高级控制定时器,4 个普通定时器和2 个基本定时器,以及2 个看门狗定时器和1 个系统嘀嗒定时器.其中系统嘀嗒定时器是前文中所描述的SysTick,看门狗 ...

  7. 【GMT43智能液晶模块】例程四:SYSTICK定时器——定时读取触摸值

    实验原理: 本实验采用系统定时器,通过简单的初始化定时20ms,每20ms读取一次触 摸值,并基于emWin的UI界面将读到的触摸值显示在界面上. 实验现象: 源代码下载链接: 链接:http://p ...

  8. STM32 Cubemx 配置定时器定时1mS

    最近才发现原来我把定时器里的配置参数代表的意义给搞混了,这里记录一下,防止以后自己忘记. 以建立一个定时1mS定时器为例: 1.先打开定时器 2.配置好时钟 3.配置定时器设置 重点来了,以前在这里我 ...

  9. Mysql定时器定时删除表数据

    由于测试环境有张日志表没定时2分钟程序就狂插数据,导致不到1一个月时间,这张日志表就占用了6.7G的空间,但是日志刷新较快,有些日志就没什么作用,就写了个定时器,定期删除这张表的数据 首先先查看mys ...

随机推荐

  1. 解决jenkins日志爆满 DNS查询错误

    一.故障 公司的jenkins因为日志量太大把磁盘占满,进而影响了其他程序,仔细一看日志文件"/var/log/jenkins/jenkins.log"几分钟产生了30G的日志 日 ...

  2. seaweedfs文件存储服务器搭建

    官方网站: https://github.com/chrislusf/seaweedfs/wiki/Getting-Started 概述 seaweedfs是一个非常优秀的由 golang 开发的分布 ...

  3. qt ui

    /******************************************************************************** ** Form generated ...

  4. Java NIO 学习笔记 缓冲区补充

    1.缓冲区分配 方法   以 ByteBuffer 为例 (1)使用静态方法 ByteBuffer buffer = ByteBuffer.allocate( 500 ); allocate() 方法 ...

  5. 数学建模python matlab 编程(疾病传播模型)

    例12:一只游船上有800(1000)人,一名游客不慎患传染病,12(10)小时后有3人发病,由于船上不能及时隔离,问经过60(30)小时,72小时,患此病的人数.(与人口模型和Logistic模型类 ...

  6. [译] NAT - 网络地址转换(2016)

    [译] NAT - 网络地址转换(2016) Published at 2019-02-17 | Last Update 译者序 本文翻译自 2016 年的一篇英文博客 NAT - Network A ...

  7. 在谷歌中缓存下载视频离线观看,js代码

    var download=function(urlInfo) { when(createFile(localFileName)) .then(function (fileInfo) { var dow ...

  8. swift 第九课 用tableview 做一个下拉菜单Menu

    写到这里的时候,自己这个项目已经完成了一半左右,项目进度自己还是挺满意.今天又有一个新的布局,要实现个下拉菜单,刚开始写的时候,觉得会很容易,后来发现也是小错不断, 我想自己限制的自己属于写博客的初期 ...

  9. Allegro静态铜皮避让问题

    使用Allegro的人都知道,Allegro的铜分为静态和动态,我的设计习惯是需要满足载流地方一般使用静态铜皮,避免设计过程中因为打孔把铜皮割裂,这是静态铜皮的一个特性,不会自动避让,强制打孔或者走线 ...

  10. 【VS开发】内存映射文件3

    内存映射文件 内存映射文件,是由一个文件到一块内存的映射.Win32提供了允许应用程序把文件映射到一个进程的函数 (CreateFileMapping).内存映射文件与虚拟内存有些类似,通过内存映射文 ...