最近公司需要推送一些信息给其他系统,因为数据数据量多,所以可以选择手动推送,也可以自动推送,说白了,就是做个定时任务推送给他们,哪有啥想的,搞呗,打工人,话不多说,直接上代码。
/**
* 推送部门整体绩效送定时任务
* @author Mr.WuJie
* @since 2020-9-22
* 5分钟走一遍 定时任务
*/
@Scheduled(cron = "0 0/5 * * * ?")
public void perfGoalAuditTask() {
Boolean timedTasksFlag = bgtLibProperties.getTimedTasksFlag();
// 这里做了一个开关,如果推送的情况有问题或者说报错之类的,就可以把这个开关,为了保险起见加了一个。
if (!timedTasksFlag) {
log.info("定时任务推送开关关闭,部门绩效暂不自动推送!");
return;
}
// 获取当前redis情况
Date date = new Date();
SimpleDateFormat sbf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
String format = sbf.format(date);
// 根据时间加上业务枚举的code来区分,作为redis的key,根据具体情况来定
String k = format + ScheduleEnum.SCHEDULE_2111.getCode();
// 给他设置一个key并且累加自增,这样可以避免多个线程如果同时存在然后进行
// 这里说一下,这一段因为之前没有加,所以有可能多个线程节点在重复的进行,而外部系统数据量一次性也不能多次接受,然而导致说数据很多都推送不过去,所以才加了这种写法
Long key = stringRedisTemplate.opsForValue().increment(k, BasConstant.INT_ONE );
// 给他一个累加值如果取出来的key不一致就可以提示报错
if(EmptyChecker.isEmpty(key) || (EmptyChecker.notEmpty(key) && BasConstant.INT_ONE != key)){
log.info("该任务已经执行,无需执行");
return;
}
// 可以按照指定时间设置过期时间
stringRedisTemplate.expire(k,10, TimeUnit.SECONDS);
log.info("进入定时任务每5分钟一次的推送部门整体绩效推送,开始时间===>{}",new Date());
// 这里做业务逻辑处理
// 。。。。。。。。
log.info("推送结束,结束时间===>{}",new Date());
}
1、redis做法
这是整的一个处理过程的代码,这里主要采用redis来实现,比较原始,也比较简单。不会浪费很多性能之类的。
2、采用数据库记录的方式
也可以采用数据库的方式来实现,就是建一张规则记录表,里面存储他的状态,每次进来先更新他的值,如果值不一样,就给提示,然后return出去,昨晚业务处理了就各他改状态,这样就不会有同时存在的了。
3、也可采用框架,比如zookeeper之类的,这些底层都封装好了的做法,但是如果没有特别必要的话其它可以简单的来做,因为引入依赖也是会消耗很多性能和资源的。
好了,2020/12/31 最后一天到来了,搞完下班了