最近做一个公众号项目,微信公众号会要求服务端找微信请求一个access_token,获取的过程:

access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。

公众平台的API调用所需的access_token的使用及生成方式说明:

1、建议公众号开发者使用中控服务器统一获取和刷新Access_token,其他业务逻辑服务器所使用的access_token均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致access_token覆盖而影响业务;

2、目前Access_token的有效期通过返回的expire_in来传达,目前是7200秒之内的值。中控服务器需要根据这个有效时间提前去刷新新access_token。在刷新过程中,中控服务器可对外继续输出的老access_token,此时公众平台后台会保证在5分钟内,新老access_token都可用,这保证了第三方业务的平滑过渡;

3、Access_token的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新access_token的接口,这样便于业务服务器在API调用获知access_token已超时的情况下,可以触发access_token的刷新流程。

所以解决方案就是做一个定时任务,服务启动的时候获取一次token,之后每隔两小时自动获取一次。这用Spring的@Scheduled注解很容易实现:

@Override
@Scheduled(fixedRate=1000*60*59*2)
public void updateToken() { try{
for(AppConfig appConfig : SysConfig.AppLists){
Token token = TokenAPI.token(appConfig.wxAppId,appConfig.wxAppSecret);
appConfig.access_token = token.getAccess_token();
Ticket ticket = TicketAPI.ticketGetticket(token.getAccess_token());
appConfig.ticket = ticket.getTicket();
logger.info("access_token:" + token.getAccess_token()+",js_api_ticket:"+ticket.getTicket());
}
}catch (Exception e){
logger.info("刷新access_token出错");
}
}

这里使用fixedRate来指定任务执行的时间间隔(毫秒记)。

然后因为现在项目只有一个服务号,没有申请测试用的服务号,本地调试也会去获取access_token ,结果导致服务端的生产环境的token失效,必须重启服务器的tomcat来刷新token。显然这种做法是非常愚蠢的,目前还没正式投入使用,投入使用后这显然不能接受。

解决方案就是,统一一个接口来向服务端获取token,当token失效时,执行一次updateToken的方法,以刷新token。

===================================================================手动分割线============================================================

然后我就比较好奇一个事,那就是,当加了@Scheduled(fixedRate=1000*60*59*2)的方法被其他方法调用的时候,定时任务会有变化吗?比如,我调用一次,那么任务是还是按照以前预定的时间跑呢,还是会在我调用之后的2小时(预约的间隔时间)才会再跑?百度Google找了找,包括官方文档也没给个说法。为这个也不想去看源代码,还是写个demo验证下算了。

首先创建一个Spring Boot的项目,引入web模块(使用rest请求来手动调用定时任务)

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

项目结构:

Service接口:

package com.xiatingfei.schedule.demo.service;

public interface TaskService {

    void SayHelloTask();

}

Service实现(每隔10秒钟在控制台打印一次Hello!):

package com.xiatingfei.schedule.demo.service.impl;

import com.xiatingfei.schedule.demo.service.TaskService;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service; import java.text.SimpleDateFormat;
import java.util.Date; @Service
public class TaskServiceImpl implements TaskService { private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); @Override
@Scheduled(fixedRate = 10000)
public void SayHelloTask() {
System.out.println("Hello! Now is " + dateFormat.format(new Date()));
}
}

Controller:

package com.xiatingfei.schedule.demo.controller;

import com.xiatingfei.schedule.demo.service.TaskService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
@RequestMapping("/demo")
public class TriggerController { @Autowired
TaskService taskService; @RequestMapping("/sayHello")
public void TriggerTask(){
taskService.SayHelloTask();
} }

然后在SpringBoot的启动类加入定时任务的注解@EnableScheduling

package com.xiatingfei.schedule.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication
@EnableScheduling
public class DemoApplication { public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}

启动应用,可以看到控制台可以定时打印Hello和时间:

在Postman给服务端发一个请求,手动调用定时任务:

get http://localhost:8080/demo/sayHello

结果:

可以看到定时任务没有受到调用的影响,还是按照自己的节奏10秒钟一次~~

(而且,还会发现Spring会在第一次收到Http请求的时候才会初始化dispatcherServlet,而不是服务启动的时候就初始化)

Spring中定时任务@Scheduled的一点小小研究的更多相关文章

  1. Spring Task定时任务Scheduled

    Spring的任务调度,采用注解的形式 Spring中@Scheduled的用法. spring的配置文件如下,先扫描到任务的类,打开spirng任务的标签 <beans xmlns=" ...

  2. 通过spring 中的@Scheduled来执行定时任务

    以前开发定时任务的功能的时候,是框架里面写好的quartz配置方式,由于功力尚浅,感觉定时跑披定时任务什么的云里雾里,很高大上,每次都不知道怎么修改配置,后来几次接触定时任务发现,还是比较好掌握的,特 ...

  3. Spring 中使用 @Scheduled 创建定时任务

    一.定时任务触发条件 1.在 Application 启动类上添加:@EnableScheduling 2.含定时方法的类上添加注解:@Component,该注解将定时任务类纳入 spring bea ...

  4. spring 配置定时任务Scheduled

    一:在spring配置的xml文件添加3条命名空间 xmlns:task="http://www.springframework.org/schema/task" xsi:sche ...

  5. Spring Boot 定时任务 @Scheduled

    项目开发中经常需要执行一些定时任务,比如在每天凌晨,需要从 implala 数据库拉取产品功能活跃数据,分析处理后存入到 MySQL 数据库中.类似这样的需求还有许多,那么怎么去实现定时任务呢,有以下 ...

  6. (4) Spring中定时任务Quartz集群配置学习

    原 来配置的Quartz是通过spring配置文件生效的,发现在非集群式的服务器上运行良好,但是将工程部署到水平集群服务器上去后改定时功能不能正常运 行,没有任何错误日志,于是从jar包.JDK版本. ...

  7. spring中定时任务quartz2.2.3

    定时任务几种实现方式 Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务,没怎么用过就不说了.Spring3.0以后自带的task,可以将它 ...

  8. spring Cloud 定时任务 @Scheduled

    本文主要记录:如何使用spring的@Scheduled注解实现定时作业,基于spring cloud 1)pom.xml 文件引入相关依赖.spring-maven插件 <?xml versi ...

  9. Spring的定时任务@Scheduled(cron = "0 0 1 * * *")

    指定某个方法在特定时间执行,如: cron="0 0 1 1 * ?" 即这个方法每月1号凌晨1点执行一次 关于这个注解的解释网上一大堆 但是今天遇到个问题,明明加了注解@Sche ...

随机推荐

  1. iOS视频硬编码技术

    iOS视频硬编码技术 一.iOS视频采集硬编码 基本原理 硬编码 & 软编码 硬编码:通过系统自带的Camera录制视频,实际上调用的是底层的高清编码硬件模块,即显卡,不使用CPU,速度快 软 ...

  2. Auto ML自动特征工程

    Auto ML自动特征工程 特征工程是在做机器学习训练的过程中必不可少的环节,特征工程就是找出对模型结果有益的特征交叉关系,通常特征工程需要耗费算法工程师大量的精力去尝试.针对这样的场景,PAI推出智 ...

  3. arm,asic,dsp,fpga,mcu,soc各自的特点

    arm,asic,dsp,fpga,mcu,soc各自的特点 人工智能受到越来越多的关注,许多公司正在积极开发能实现移动端人工智能的硬件,尤其是能够结合未来的物联网应用,对于移动端人工智能硬件的实现方 ...

  4. H.265视频编码与技术全析(上)

    H.265视频编码与技术全析(上) 一. 概述 作为新一代视频编解码格式,H.265得到越来越广泛的应用.不久之前,苹果公司在翘首期盼中发布了iPhone6,该款手机较之以往的iPhone,不仅仅只是 ...

  5. java后端知识点梳理——web安全

    跨域 当浏览器执行脚本时会检查是否同源,只有同源的脚本才会执行,如果不同源即为跨域. 这里的同源指访问的协议.域名.端口都相同. 同源策略是由 Netscape 提出的著名安全策略,是浏览器最核心.基 ...

  6. 《吃透MQ系列》之扒开Kafka的神秘面纱

    大家好,这是<吃透 MQ 系列>的第二弹,有些珊珊来迟,后台被好几个读者催更了,实属抱歉! 这篇文章拖更了好几周,起初的想法是:围绕每一个具体的消息中间件,不仅要写透,而且要控制好篇幅,写 ...

  7. Java synchronized对象级别与类级别的同步锁

    Java synchronized 关键字 可以将一个代码块或一个方法标记为同步代码块.同步代码块是指同一时间只能有一个线程执行的代码,并且执行该代码的线程持有同步锁.synchronized关键字可 ...

  8. MQTT 协议是个啥?这篇文章告诉你!

    文章首发于我的公众号「程序员cxuan」,欢迎大家关注呀- 说到做到! 之前有位读者给我留言说想要了解一下什么是 MQTT 协议,顺便还把我夸了一把,有点不好意思啦. 那么读者的要求必须要满足啊,所以 ...

  9. 谷歌浏览器加载驱动(chromedriver)——selenium

    http://chromedriver.storage.googleapis.com/index.html 可以到该网站下载对应的谷歌驱动器(注意:需要版本和操作系统对应,其中windows统一32的 ...

  10. 免费获取思维导图Mindmaster会员教程

    免费获取思维导图Mindmaster会员教程 步骤一.下载安装 搜索亿图官方网页,下载安装免费版Mindmaster思维导图. 步骤二.点击登录 打开Mindmaster思维导图,点击登录,可以使用微 ...