springboot整合quartz,实现天气数据的同步定时获取
pom.xml
<!-- 整合quartz -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
<version>${spring.cloud.version}</version>
</dependency>
配置Configuration,需要注入两个实例JobDetail和Trigger
package com.example.config;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.example.job.WeatherDataSyncJob;
/**
* 使用quartz schedule主要分为两个步骤,一个方面是创建一个任务,其次是对这个任务进行配置。
* 这里我们是为了同步定时获取天气数据,并缓存到redis。
* 首先创建WeatherDataSyncJob,用于定义同步天气数据的定时任务,该类继承org.springframework.scheduling.quartz.QuartzJobBean,
* 并重写executeInternal方法
* @author Administrator
* 配置QuartSchedule,需要两个bean,JobDetail和
*/
@Configuration
public class QuartzSchedulerConfig {
//JobDetail,定义一个特定的job
@Bean
public JobDetail weatherDataSyncJobDetail(){
//建造者模式????
return JobBuilder.newJob(WeatherDataSyncJob.class).withIdentity("weatherDataSyncJob").storeDurably().build();
}
//trigger,定义一个trigger,何时以什么形式触发
@Bean
public Trigger weatherDataSyncTrigger(){
//设置任务几秒钟执行一次
SimpleScheduleBuilder schedBuilder = SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10).repeatForever();
return TriggerBuilder.newTrigger().forJob(weatherDataSyncJobDetail()).withIdentity("weatherDataSyncTrigger").withSchedule(schedBuilder).build();
}
}
编写定时任务
package com.example.job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.http.ResponseEntity;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.web.client.RestTemplate;
import com.example.vo.WeatherData;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* 使用quartz schedule主要分为两个步骤,一个方面是创建一个任务,其次是对这个任务进行配置。
* 这里我们是为了同步定时获取天气数据,并缓存到redis。
* 首先创建WeatherDataSyncJob,用于定义同步天气数据的定时任务,该类继承org.springframework.scheduling.
* quartz.QuartzJobBean, 并重写executeInternal方法
*
* @author Administrator
*
*/
public class WeatherDataSyncJob extends QuartzJobBean {
@Autowired
RestTemplate restTemplate;
@Autowired
RedisTemplate<String, String> redisTemplate;
@Autowired
StringRedisTemplate stringRedisTemplate;
String uri = "http://wthrcdn.etouch.cn/weather_mini?city=深圳";
/**
* 定时执行的业务逻辑
*/
@Override
protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {
System.out.println("定时任务:获取深圳天气.........");
String body = null;
ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
// 如果缓存中没有,需要取出数据,并存入缓存
ResponseEntity<String> weatherData = restTemplate.getForEntity(uri, String.class);
// 使用ObjectMapper进行处理
ObjectMapper mapper = new ObjectMapper();
if (weatherData.getStatusCodeValue() == 200) {
body = weatherData.getBody();
WeatherData weatherData2 = null;
try {
weatherData2 = mapper.readValue(body, WeatherData.class);
ops.set(uri, body, 5 * 60 * 1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
启动Applciation
我们可以看到,每隔10秒,获取数据