任务是配置一个可以配置更改的定时任务用来跑批量任务进行统计。不能用集成的,只能用原生的quartZ的写法。
首先是定义实体类:
public class PushConfig extends BasePojo{
/**
*任务id
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
/**
* 任务名
*/
@Column(name = "task_name")
private String taskName;
/**
* 任务间隔
*/
@Column(name = "task_interval")
private int taskInterval;
/**
* 任务间隔单位
*/
private int unit;
/**
*创建人的id
*/
private int createu;
/**
* 修改人
*/
private String updateu;
/**
* 任务类型
*/
@Column(name = "task_type")
private int taskType;
/**
* 有效性
*/
private int invalid;
/**
* 任务分组
*/
@Column(name = "job_group")
private String jobGroup;
/**
* 任务运行时间表达式
* */
@Column(name = "cron_expression")
private String cronexpression;
/** 任务描述 */
private String description;
//定时任务post的url
private String url;
// 定时任务的执行类
public String className;
//定时器触发器名和触发器组名(暂时未用到,用于分组,暂时和任务名,任务组一致)
private String triggerName;
private String triggerGroupName;
.....
定义过实体类之后,就可以将这个定时任务通过数据库的方式进行持久化存储。然后新建一个job的管理类来对定时任务进行一个集中式的管理:
public static void addJob(PushConfig pushConfig) {
try {
Scheduler sched = schedulerFactory.getScheduler();
// 任务名,任务组,任务执行类
String className = pushConfig.getClassName();
JobDetail jobDetail=null; // 触发器
TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
// 触发器名,触发器组
triggerBuilder.withIdentity(pushConfig.getTriggerName(), pushConfig.getTriggerGroupName());
triggerBuilder.startNow();
// 触发器时间设定
triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(pushConfig.getCronexpression()));
// 创建Trigger对象
CronTrigger trigger = (CronTrigger) triggerBuilder.build();
if ("gpsPushJob".equals(className)) {
jobDetail = JobBuilder.newJob(GpsPushJob.class).withIdentity(pushConfig.getTaskName(), pushConfig.getJobGroup()).build();
}
// 调度容器设置JobDetail和Trigger jobDetail.getJobDataMap().put("creatuId",pushConfig.getCreateu()); jobDetail.getJobDataMap().put("url",pushConfig.getUrl()); sched.scheduleJob(jobDetail, trigger); // 启动 if (!sched.isShutdown()) { sched.start(); } }catch (ObjectAlreadyExistsException e1){ return; } catch (Exception e) { throw new RuntimeException(e); } }
需要注意的是,为了保证数据库中的字段用户等便于存储,我在这个定时任务中引入了jobdetail,这个jobdetail的主要作用是存放一些临时的例如这个客户的名字,这个客户的要求(主动或被动推送等),这个要求会在下边的任务的进行过程中体现。主要是为了记录这个任务的成功失败客户等信息。
接下来就可以在要写的job中进行一个逻辑的书写,如下
@Component
public class GpsPushJob extends LoadJob implements Job {
@Autowired
private IGpsService gpsService;
@Autowired
private IVehicleService vehicleService;
@Autowired
private IRedisClientService redisClientService;
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
//这里添加一个时间的逻辑,目的是为了灵活调用时间,取消写死的时间的设置,用了redis暂时存储
// key的名称是id_url,value是时间
JobDetail jobDetail = jobExecutionContext.getJobDetail();
Integer creatuId = (Integer) jobDetail.getJobDataMap().get("creatuId");
String url = (String) jobDetail.getJobDataMap().get("url");
boolean b = this.redisClientService.existsKey(0, creatuId + "_" + url+"_GPS");
if(b==false){
DateTime dateTime = new DateTime();
redisClientService.put(1,creatuId + "_" + url+"_GPS",dateTime.toString(FormateConstant.getDateString));
}
List<GpsInfo> gps = this.gpsService.queryGps(LoadJob.departments, LoadJob.vehicles,creatuId, url);
ObjectMapper mapper = new ObjectMapper();
try {
String s = mapper.writeValueAsString(gps);
JsonResponse aTrue = new JsonResponse(true, "", s);
System.out.println("aTrue "+aTrue.toString());
// postDate(s,url);
} catch (JsonProcessingException e) {
e.printStackTrace();
JsonResponse aTrue = new JsonResponse(false, "服务器错误", "");
}
}
我们可以看到,这里的逻辑是将用户url等做了一个记录,并且在其他地方将用户要的信息发送给用户。