5、Quartz定时任务

业务需求

说明:如果用户提交了订单.在30分钟之内没有完成支付,则将订单的状态由1改为6.

定时任务Quartz

Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。
5、Quartz定时任务_第1张图片

  1. 调度器 负责任务管理.内部有时钟监控
  2. 触发器 当调度器需要执行任务时,通过触发器启动新的线程去执行.
  3. JOB/JobDetail 定义任务.

springboot整合

添加依赖

	<!--添加Quartz的支持 -->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-quartz</artifactId>
	</dependency>

编辑配置类

@Configuration
public class OrderQuartzConfig {
	
	//定义任务详情
	@Bean
	public JobDetail orderjobDetail() {
		//指定job的名称和持久化保存任务
		return JobBuilder
				.newJob(OrderQuartz.class)	//定时任务方法类
				.withIdentity("orderQuartz")
				.storeDurably()
				.build();
	}
	//定义触发器
	@Bean
	public Trigger orderTrigger() {
		/*SimpleScheduleBuilder builder = SimpleScheduleBuilder.simpleSchedule()
				.withIntervalInMinutes(1)	//定义时间周期
				.repeatForever();*/
		//每分钟执行一次
		CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0 0/1 * * * ?");
		return TriggerBuilder
				.newTrigger()
				.forJob(orderjobDetail())
				.withIdentity("orderQuartz")
				.withSchedule(scheduleBuilder).build();
	}
}

编写定时任务

//准备订单定时任务
@Component
public class OrderQuartz extends QuartzJobBean{

	@Autowired
	private OrderMapper orderMapper;

	/**当用户订单提交30分钟后,如果还没有支付.则交易关闭
	 * 现在时间 - 订单创建时间 > 30分钟  则超时
	 * new date - 30 分钟 > 订单创建时间
	 */
	@Override
	@Transactional
	protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
		//设定30分钟超时
		Order order = new Order();
		order.setStatus(6).setUpdated(new Date());
		UpdateWrapper<Order> updateWrapper = new UpdateWrapper<>();
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.MINUTE,-30);
		Date date = calendar.getTime();
		updateWrapper.eq("status", 1).lt("created", date);
		orderMapper.update(order,updateWrapper);
		System.out.println("定时任务执行成功...");
	}
}

你可能感兴趣的:(微服务,quartz)