利用ScheduledExecutorService实现定时任务

ScheduledExecutorService是java并发包下提供给我们实现定时任务的工具。
利用它,我们能轻松的实现定时任务。

/**
 * 定时刷新token
 * @author Mingchenchen
 */
@Component
public class RefreshToken {
    private static Logger logger = Logger.getLogger(RefreshToken.class);

    @PostConstruct
    public void init(){
        logger.info("定时任务启动:20分钟刷新一次token");
        //此处如果间隔很短则需要注意并发性 如果任务执行时间>delay时间则存在并发问题
        //schedule()则不会 它是任务完成后的XX分执行下一次 而scheduleAtFixedRate是固定的间隔执行
         ScheduledExecutorService service = Executors
                .newSingleThreadScheduledExecutor();
         service.scheduleAtFixedRate(getLogginDmsRunner(), 0, 20, TimeUnit.MINUTES);
    }

    /**
     * 登录获取token
     * @return
     */
     private static Runnable getLogginRunner(){
         return new Runnable() {
              public void run() {
                logger.info("定时任务开始执行:登录");
                UserLoginInfoVo userLoginInfoVo = new UserLoginInfoVo();
                userLoginInfoVo.setUserName("foo");
                userLoginInfoVo.setPassWord("bar");
                LoginUtil.login(userLoginInfoVo);

                //结果存入缓存
                logger.info("定时任务执行完毕:token = " + userLoginInfoVo.getToken());
              }
            };
     }
}

需要注意的一点:
此处把它配置成了@Compoment 然后在public void init(){}方法里面启动定时任务,并注解了
@PostConstruct,让spring在构造之前初始化。
即在服务启动的时候就会执行init方法把定时任务启动起来。

之前我是用的static块,然后忘记了加上@compoment导致没有执行。

结果:
利用ScheduledExecutorService实现定时任务_第1张图片

你可能感兴趣的:(JAVA基础,小技巧)