发表于: 2019-12-16 20:06:08
1 1090
一、今天完成的事
修改程序中出现的bug
/**
* 获取签到信息(日历)
*
* @param token
* @return
*/
@GetMapping("/u/getCheckinDate")
private PageInfo<StudentCheckin> getCheckinDate(@RequestParam(value = "start", defaultValue = "1") int start,
@RequestParam(value = "size",defaultValue = "10")int size, String token) throws Exception {
PageHelper.startPage(start, size);
//获取id
CheckinController checkinController = new CheckinController();
String openId = checkinController.getIdFromOpenId(token);
Student student = checkinService.getStudentID(openId);
List<StudentCheckin> studentCheckinList = checkinService.getCheckinDate(student.getId());
return new PageInfo<>(studentCheckinList);
}
@PostMapping("/u/checkin")
private boolean checkin(String token) throws Exception {
//获取id
CheckinController checkinController = new CheckinController();
String openId = checkinController.getIdFromOpenId(token);
Student student = checkinService.getStudentID(openId);
//获取信息
student = checkinService.getStudent(student.getId());
//增加签到记录
StudentCheckin studentCheckin = new StudentCheckin();
Long date = (System.currentTimeMillis());
studentCheckin.setDate(date);
boolean status = checkinService.addCheckin(student.getId(), date);
if (status) {
status = checkinService.updateCheckin(student);
}
return status;
}
/**
* 内部处理token获取id
*
* @param token
* @return
*/
private String getIdFromOpenId(String token) throws Exception {
DesUtil desUtil = new DesUtil();
String desToken = desUtil.decrypt(token);
System.out.println(desToken);
String[] splitToken = desToken.split("/");
String openId = splitToken[0];
System.out.println(openId);
return openId;
}
二、遇到的问题
三、收获
学习quatz定时执行程序
在复盘项目中,因为每个月的签到信息要定时清除,所以要学习使用quartz来执行定时程序,在每月的一号凌晨十二点执行
1.java中定时任务调度的实现方式
Timer:
特点:简单易用,但由于所有任务都是由同一个线程来调度,因此所有任务都是串行执行的,同一时间只能有一个任务在执行,前一个任务的延迟或异常都会影响到之后的任务;能实现简单的定时任务,稍微复杂或要求高的定时任务却不好实现。
ScheduledExcutor:
特点:每一个被调度的任务都会由线程池中一个线程去执行,因此任务是并发执行的,相互之间不会受到干扰。需要注意的事,只有当任务的执行时间到来时,ScheduledExecutor才会真正启动下一个线程,其余时间都是在轮询任务的状态。
Spring Scheduler:
特点:spring对任务调度的实现支持,可以指定任务的执行时间,但对任务队列和线程池的管控较弱,一般集成于项目中,小任务很方便
JcronTab:
特点:
可指定任务的执行时间;
提供完全按照Unix的Unix-Posix crontab的格式来规定时间;
支持多种任务调度的持久化方法,包括普通文件、数据库以及XML文件进行持久化;
JCronTab内置了发邮件功能,可以将任务执行结果方便地发送给需要被通知的人;
设计和部署是高性能并可拓展
Quartz:
特点:quartz作为一个开源的作业调度框架,提供了巨大的灵活性而不牺牲简单性。我们能够用它来执行一个作业而创建简单的或复杂的调度。它有很多特征,如:数据库、集群、插件、JavaMail支持,EJB作业预构建,支持cron-like表达式等
springboot集成quartz非常简单,最简单的情况下只需引入依赖我们就可以享受quartz提供的功能,springboot默认会帮我们配置好quartz;
2.Quartz相关概念:
Scheduler:调度器,进行任务调度,quartz的大脑
Job:业务Job,亦可称业务组件,定时任务的具体执行业务需要实现此接口,调度器会调用此接口的execute方法完成我们的定时业务
JobDetail:用来定义业务Job的实例,我们可以称之为quartz job,很多时候我们谈到job指的是jobDetail
Trigger:触发器,用来定义一个指定的job何时被执行
jobBuilder:job构建起,用来定义或创建触发器的实例
3.quartz实例
直接在程序中增加
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
修改配置文件
#quartz相关配置:
spring.quartz.properties.org.quartz.scheduler.instanceName=quartzScheduler
spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO
spring.quartz.properties.org.quartz.jobStore.class=
spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=
spring.quartz.properties.org.quartz.jobStore.tabelPrefix=QRTZ_
spring.quartz.properties.org.quartz.jobStore.isCluestered=false
spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=10000
spring.quartz.properties.org.quartz.jobStore.userProperties=false
spring.quartz.properties.org.quartz.threadPool.class=
spring.quartz.properties.org.quartz.threadPool.threadCount=10
spring.quartz.properties.org.quartz.threadPool.threadPriority=5
spring.quartz.properties.org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread=true
#数据库方式
spring.quartz.job-store-type=jdbc
#初始化表结构
spring.quartz.jdbc.initialize-schema=never
创建自定义类,开启定时任务
需要使用@EnableScheduling注解启动定时任务,然后在需要定时执行的方法上加上@Scheduled即可:
ScheduleConfig:
import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.cff.springbootwork.quartz.job.SampleJob;
@Configuration
public class QuartzJobConfig {
@Value("${schedule.task.test}")
private String testScheduleCron;
@Bean
public JobDetail teatQuartzDetail(){
return JobBuilder.newJob(SampleJob.class).withIdentity("testQuartz").storeDurably().build();
}
@Bean
public Trigger testQuartzTrigger(){
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(testScheduleCron);
return TriggerBuilder.newTrigger().forJob(teatQuartzDetail())
.withIdentity("testQuartz")
.withSchedule(scheduleBuilder)
.build();
}
}
这里的JobDetail 中的newJob必须实现Job接口,因此我们要自己建一个job。
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.stereotype.Component;
import com.cff.springbootwork.quartz.service.ScheduleService;
@Component
public class SampleJob extends QuartzJobBean {
@Autowired
private ScheduleService scheduleService;
private String name;
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
scheduleService.doJob();
}
public ScheduleService getScheduleService() {
return scheduleService;
}
public void setScheduleService(ScheduleService scheduleService) {
this.scheduleService = scheduleService;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
总结:quartz配置太多了,还没怎么弄清除,先写一个小例子,明天在看看如何实现
四、明天的计划
看程序还有没有问题,看看前端有没有什么传参出错的地方修改,继续看quartz。
评论