定时任务
jdk的TimerTask
必须会,在程序运行期间动态的启动定时任务。比如30分钟后废除订单
1.从TimerTask类派生任务类,重写run方法
2.实例化Timer对象,schedule方法调度任务。
//实例化Timer对象,schedule方法调度任务。
//延时执行的方法
public class GetDataTask extends TimerTask {
@Override
public void run() {
System.out.println("获取接口数据");
}
}
//延时执行操作
public class TimerTaskTest {
public static void main(String[] args) throws ParseException {
Timer timer = new Timer();
// 延迟5秒执行,同时每隔5秒执行一次
timer.schedule(new GetDataTask(),5000,5000);
// 指定时间执行
String time = "2020-08-10 18:38:20";
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = format.parse(time);
timer.schedule(new GetDataTask(),date);
}
}
spring-task
必须会,在程序启东时,预先定义好了一些定时任务执行。比如每天的8,12,18,22去获取天气数据保存
1.添加spring-context-support.jar
2.开启@Scheduled注解识别<task:annotation-driven>
3.编写任务类,在任务方法上加@Scheduled(cron="秒 分 时 日 月 周")
<!--spring.xml-->
<!--@Scheduler定时任务注解识别开关-->
<task:annotation-driven></task:annotation-driven>
@Component
public class GetWeatherTask {
@Resource
private RedisService rs;
// cron表达式,星期和日必有一个是问号
//cron表达式:秒 分 时 日 月 周 年(可省)
@Scheduled(cron = "0 * 12 ? * *")
public void invokeWeatherInterface(){
String path = "http://api.tianapi.com/txapi/tianqi/index?key=db3d22eebbff236d1b3b424ea12c3dd6&city=郑州";
RestTemplate t = new RestTemplate();
String forObject = t.getForObject(path, String.class);
JSONObject jsonObject = JSON.parseObject(forObject);
//取jsonObject里的newslist
JSONArray newslist = jsonObject.getJSONArray("newslist");
JSONObject currentDay = newslist.getJSONObject(0);
//newslist的从1-结尾
List<Object> objects = newslist.subList(1, newslist.size() - 1);
currentDay.put("futureDays",objects);
String area = currentDay.getString("area");
String date = currentDay.getString("date");
//保存String或hash都可以,都可以做到根据日期获取数据
String key = RedisKey.WEATHER_KEY+area;
//放缓存里
rs.hset(key,date,JSON.toJSONString(currentDay));
}
}