定时任务使用redis控制节点代码实现

1 篇文章 0 订阅
1 篇文章 0 订阅

最近公司需要推送一些信息给其他系统,因为数据数据量多,所以可以选择手动推送,也可以自动推送,说白了,就是做个定时任务推送给他们,哪有啥想的,搞呗,打工人,话不多说,直接上代码。


    /**
     * 推送部门整体绩效送定时任务
     * @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 最后一天到来了,搞完下班了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值