Quartz
介绍
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。Quartz的最新版本为Quartz 2.3.2。
组件说明:
1.Job 用户自定义的任务.
2.JobDetail 将用户封装之后的结果.
3.调度器 负责任务的协调服务.
4.触发器 当接收调度器的指令后,开启线程执行任务.
引入 jar包
<!--添加Quartz的支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
导入Quartz 配置
@Configuration
public class OrderQuartzConfig {
// springBoot 只要添加了jQuartzjar包 就会进行开箱即用的操作
//定义任务详情
@Bean //将对象交给spring管理
public JobDetail orderjobDetail() {
//指定job的名称和持久化保存任务
return JobBuilder
.newJob(OrderQuartz.class) //添加自己的任务
.withIdentity("orderQuartz")//指定任务名称
.storeDurably()
.build();
}
//定义触发器
@Bean
public Trigger orderTrigger() {
/*SimpleScheduleBuilder builder = SimpleScheduleBuilder.simpleSchedule()
.withIntervalInMinutes(1) //定义时间周期
.repeatForever();*/
//通过调度器,指定程序多久执行一次.
//0 0/1 * * * ? 时间表达式 规定任务多久执行一次
//创建调度器 之后指定多久执行一次
CronScheduleBuilder scheduleBuilder
= CronScheduleBuilder.cronSchedule("0 0/1 * * * ?");//0 0/1 * * * ? Quartz表达式 每个一分钟执行一次
return TriggerBuilder
.newTrigger()
.forJob(orderjobDetail())//执行什么任务
.withIdentity("orderQuartz")//任务名称
.withSchedule(scheduleBuilder).build();
}
}
执行定时任务
//准备订单定时任务
@Component
public class OrderQuartz extends QuartzJobBean{ //任务 要继承QuartzJobBean
//注入订单mapper对象
@Autowired
private OrderMapper orderMapper;
/**
* 当规定的执行时间一到,触发器就会开启线程,执行指定的任务.
* 业务需求:
* 要求将超时订单关闭. 要求30分钟 status 由1改为6
* 如何定义超时:
* now() - created > 30分钟 订单超时
* created < now -30
* Sql:
* update tb_order set status = 6,updated = #{date}
* where created < (now -30) and status = 1;
*
*/
@Override
@Transactional
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
//对时间进行计算
Calendar calendar = Calendar.getInstance(); //实例化对象 获取当前时间
calendar.add(Calendar.MINUTE, -30);
Date timeOut = calendar.getTime();
Order entity = new Order();
entity.setStatus(6).setUpdated(new Date());
UpdateWrapper<Order> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("status", 1)
.lt("created",timeOut);
orderMapper.update(entity, updateWrapper);
System.out.println("定时任务执行成功!!!!");
}
}