发表于: 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。



返回列表 返回列表
评论

    分享到