Spring定时任务的几种实现 附实例
发布网友
发布时间:2022-04-28 10:48
我来回答
共1个回答
热心网友
时间:2023-07-14 08:15
1、Java自带的java.util.Timer类,自定义一个类继承TimerTask
例子:
public class TestTimerTask {
Timer timer;
public TestTimerTask(int a) {
timer = new Timer();
timer.schele(new GoodTimerTask(),0, 1000*a);
}
public static void main(String[] args) {
System.out.println("About to schele task.");
new TestTimerTask(3);
}
class GoodTimerTask extends TimerTask{
@Override
public void run() {
System.out.println("Timer running!");
}
}
}
2、Spring3.0以后自带的task
//一、在applicationContext.xml配置的方式
//1、准备jar包
// (1)spring核心jar包
//2、在项目中写个类
@Service
public class BookScheleTask {
@Resource
private BookService bookService;
public Page<Book> findAllBook(){ //不带参数
System.out.println("BookScheleTask.findAllBook()");
return bookService.findBook(1);
}
}
//3、在ApplicationContext.xml配置文件中写如下配置:
<!-- 自动扫描 -->
<context:component-scan base-package="com" />
<!-- spring框架的Scheled定时器 -->
<task:scheled-tasks>
<task:scheled ref="bookScheleTask" method="findAllBook" cron="0 0 12 * * ?"/>
</task:scheled-tasks>
说明:(1)<context:component-scan base-package="com" />该配置,相信大家用过spring的都知道是什么意思,
是spring用于扫描注解的
(2)<task:scheled-tasks>,该配置的作用是定义一个时间计划任务,定义某个类下面某个方法在某个时间执行。
<task:scheled ref="bookScheleTask" method="findAllBook" cron="0 0 12 * * ?"/>,ref表示的是
某个要在规定时间执行的类,method表示要执行的类下的某个方法,cron表示时间表达式,具体详细的表达式
可以百度查询
//二、基于注解的spring定时器
// 1、同上,准备好spring的jar包
// 2、在项目中创建一个类,用于执行定时任务的类。如下:
@Component("bookScheleTask")
public class BookScheleTask {
@Resource
private BookService bookService;
@Scheled(cron="0 50 14 * * ?")
public void findAllBook(){
System.out.println("BookScheleTask.findAllBook()");
bookService.findBook(1);
}
}
// 说明:基于注解的方法,@Component("bookScheleTask")表示定义了一个别名。
// @Scheled(cron="0 50 14 * * ?")表示:该注解下的方法是一个时间任务,在cron="0 50 14 * * ?"(14:50)执行findAllBook()方法
3、使用quartz
//首先我们需要定义一个任务类,比如为MyJob02 ,
//该类需要继承Job类,然后添加execute(JobExecutionContext context)方法,在
//这个方法中就是我们具体的任务执行的地方。
//由希望由调度程序执行的组件实现的接口
public class MyJob02 implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
// TODO Auto-generated method stub
// 执行响应的任务.
System.out.println("HelloJob.execute,"+new Date());}}
public class QuartzTest5 {
public static void main(String[] args) throws Exception {
//SchelerFactory 是一个接口,用于Scheler的创建和管理
SchelerFactory factory = new StdSchelerFactory();
//从工厂里面拿到一个scheler实例//计划表(可能翻译的不太贴切),现在我们有了要做的内容,
//与调度程序交互的主要API
/** Scheler的生命期,从SchelerFactory创建它时开始,
到Scheler调用shutdown()方法时结束;Scheler被创建后,可以增加、删除和列举Job和Trigger,
以及执行其它与调度相关的操作(如暂停Trigger)。但是,Scheler只有在调用start()方法后,
才会真正地触发trigger(即执行job)*/
Scheler scheler = factory.getScheler();
//具体任务.//用于定义作业的实例
//JobBuilder - 用于定义/构建JobDetail实例,用于定义作业的实例。
JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("job1", "group1").build();
//Trigger(即触发器) - 定义执行给定作业的计划的组件
//TriggerBuilder - 用于定义/构建触发器实例
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
.withSchele(CronScheleBuilder.cronSchele("0/1 * * * * ?")).build();
scheler.scheleJob(job, trigger);scheler.start();
}