任务调度器

任务调度

任务系统,其实这里说的任务系统指的是定时任务。定时任务是企业级开发中必不可少的组成部分,在生活中,我们经常会制定一些”计划任务”,比如学校的上课和下课铃声等,即在某个时间点做某件事情.同样地,在企业级应用中,也会经常碰到类似的任务调度的需求。

下面来看几个例子.在购物网站,每天凌晨统计商品排名,每天晚上定点统计当日的销量,销售额,盈利等信息并生成报表,每15分钟查询用户的新订单并推送给对应的处理人.在社区网站,每天统计用户的在线时长,并按照某种规则给予一定的称号和奖励等.在后台服务中做系统维护,每个工作日的固定时间将数据进行备份.可见企业应用中离不开灵活的任务调度.

定时任务的实现方式

(1) Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务,使用这种方式可以让你的程序按照某一个频率执行,但不能再指定时间运行,一般用的比较少.

(2) 使用Quertz,这是一个功能比较强大的调度器,可以让你的程序在指定的时间执行,也可以按照某一个频率执行,但是配置起来比较复杂.

(3) Spring3.0以后自带的task,可以将它看着一个轻量级的Quartz,而且使用起来比Quartz简单许多.我们可以使用的就是该方式进行定时任务的调度.

Quartz的使用方式

先了解一下Quartz的一些概念

  • 工作(Job):用于定义具体执行的工作
  • 工作明细(JobDetail):用于描述定时工作相关的信息
  • 触发器(Trigger):描述了工作明细与调度器的对应关系
  • 调度器(Scheduler):用于描述触发工作的执行规则,通常使用cron表达式定义规则

简单说就是你定时干什么事情,这就是工作,工作不可能就是一个简单的方法,还要设置一些明细信息。工作啥时候执行,设置一个调度器,可以简单理解成设置一个工作执行的时间。工作和调度都是独立定义的,它们两个怎么配合到一起呢?用触发器。

下面开始springboot整合Quartz。
步骤①:导入springboot整合Quartz的starter

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

步骤②:定义任务Bean,按照Quartz的开发规范制作,继承QuartzJobBean

public class MyQuartz extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        System.out.println("quartz task run...");
    }
}

步骤③:创建Quartz配置类,定义工作明细(JobDetail)与触发器的(Trigger)bean

@Configuration
public class QuartzConfig {
    @Bean
    public JobDetail printJobDetail(){
        //绑定具体的工作
        return JobBuilder.newJob(MyQuartz.class).storeDurably().build();
    }
    @Bean
    public Trigger printJobTrigger(){
        ScheduleBuilder schedBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ?");
        //绑定对应的工作明细
        return TriggerBuilder.newTrigger().forJob(printJobDetail()).withSchedule(schedBuilder).build();
    }
}

工作明细中要设置对应的具体工作,使用newJob()操作传入对应的工作任务类型即可。

​ 触发器需要绑定任务,使用forJob()操作传入绑定的工作明细对象。此处可以为工作明细设置名称然后使用名称绑定,也可以直接调用对应方法绑定。触发器中最核心的规则是执行时间,此处使用调度器定义执行时间,执行时间描述方式使用的是cron表达式。

cron在线表达式生成器:http://cron.ciding.cc/

Task的使用方式

基于Quartz,我们本来只想完成在某一个时间来触发某一个功能,却要做一些复杂的配置。
spring针对上述问题进行了简化,开发了自己的任务管理组件——Task

Task:要做定时任务总要告诉容器有这功能吧,然后定时执行什么任务直接告诉对应的bean什么时间执行就行了,就这么简单,一起来看怎么做

步骤①:开启定时任务功能,在引导类上开启定时任务功能的开关,使用注解@EnableScheduling

@SpringBootApplication
//开启定时任务功能
@EnableScheduling
public class SpringbootTaskApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootTaskApplication.class, args);
    }
}

步骤②:定义Bean,在对应要定时执行的操作上方,使用注解@Scheduled定义执行的时间,执行时间的描述方式还是cron表达式

@Component
public class MyTask {
	//需要执行的任务   每十秒钟执行一次
	//@Scheduled 定义定时任务的信息
	//  属性 cron表达式:定义执行的时间
	@Scheduled(cron="0/10 * * * * ?")
	public void tesk1(){
		System.out.println("tesk1.....["+new Date()+"]");
	}
}

总结:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值