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

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. express利用nodemailer发送邮件(163邮箱)

    Nodemailer 是一个简单易用的Node.js邮件发送组件 首先安装这个组件 npm install nodemailer --save 安装之后,可以在某个get请求下,发送邮件,具体路由代码 ...

  2. UML期末复习题——2.7:UML Sequence Diagram

    第七题:顺序图 重要概念: 1. 顺序图的主要介绍,在之前对第5题“系统顺序图”的解析讲解里已经很详细了,在这里只是对部分不全面的内容进行补充. 第五题:系统顺序图&后置条件 http://w ...

  3. 慎用array_filter函数

    array_filter (PHP 4 >= 4.0.6, PHP 5, PHP 7) array_filter - 用回调函数过滤数组中的单元 说明 array array_filter (  ...

  4. Java同步数据结构之ConcurrentLinkedDeque

    前言 由于LinkedBlockingDeque作为双端队列的实现,采用了单锁的保守策略使其不利于多线程并发情况下的使用,故ConcurrentLinkedDeque应运而生,它是一种基于链表的无界的 ...

  5. Swift 可选链

    可选链(Optional Chaining)是一种可以请求和调用属性.方法和子脚本的过程,用于请求或调用的目标可能为nil. 可选链返回两个值: 如果目标有值,调用就会成功,返回该值 如果目标为nil ...

  6. php操作成功返回当前页并刷新

    echo "<script>alert('操作成功');location.href='".$_SERVER["HTTP_REFERER"].&quo ...

  7. maven编译正常,运行报错:中没有主清单属性

    在pom.xml添加插件 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId&g ...

  8. android之Framework问题总结:

    移动开发知识体系总章(Java基础.Android.Flutter) Android Handler消息机制 . Android中为什么主线程不会因为Looper.loop里的无限循环ANR? 1.1 ...

  9. appium(api操作)

    driver.current_activity #获取当前activity driver.current_package #获取包名 driver.lock(seconds=2) #息屏 #收起虚拟键 ...

  10. linux netstat 查看网络连接状况

    netstat -lnpnetstat -an |grep 127.0.0.1 tcp 0.0.0.0:* LISTEN tcp 0.0.0.0:* LISTEN [root@wang /]# net ...