spring周期任务(代码模板)

package cn.changemax.application.job;

import lombok.extern.log4j.Log4j2;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

/**
 * @author WangJi
 * @Description 周期任务模板
 * @Date 2019/11/4 16:28
 */
@Log4j2
@Component
@EnableScheduling
public class PeriodicTaskJob {
    /**
     * 锁超时时间,防止线程在入锁以后,无限的执行等待
     */
    private int expireMsecs = 10 * 60 * 1000;
    /**
     * 锁等待时间,防止线程饥饿
     */
    private int timeoutMesecs = 1 * 1000;

    @Transactional(rollbackFor = Exception.class)
    @Scheduled(cron = "0 0/10 * * * ?")
    public void execute() {
        Date nowDate = new Date();

        String lockKey = "PERIODIC_TASK_JOB_KEY";
        RedisLock lock = new RedisLock(redisTemplate, lockKey, timeoutMesecs, expireMsecs);
        if (!lock.lock()) {
            log.info(() -> "其他任务正在运行中");
            return;
        }

        try {
            long startTime = System.currentTimeMillis();


            //逻辑代码.....
   

            lock.unlock();
            long endTime = System.currentTimeMillis();
            log.info(() -> "周期任务结束,本次耗时:" + (endTime - startTime) + "毫秒");
        } catch (ReadAppletsException e) {
            e.printStackTrace();
            log.error(() -> "周期任务发生异常:" + e.getMessage());
            lock.unlock();
        } catch (Exception e) {
            e.printStackTrace();
            log.error(() -> "周期任务发生异常:" + e.getMessage());
            lock.unlock();
        }
    }


}

 

上面很清楚了,直接编写你的周期任务代码内容就是了。前提要依赖于redis

posted @ 2019-11-13 10:59  CHANGEMAX  阅读(224)  评论(0编辑  收藏  举报