任务调度Quartz框架

    技术2022-11-26  14

     

    一个简单的例子

    /** * quartz相关类: * Job:实现该接口定义运行任务 * JobDetail:描述Job信息,如: job实现类,job名称等 * Trigger:触发Job执行的时间触发器,主要有SimpleTrigger和Cron|Trigger两个子类 * Calendar:日期特定时间点的集合 * Scheduler:quartz的独立运行容器,Trigger与JobDetail可以注册到Scheduler中 * ThreadPool:Scheduler使用线程池以提高运行效率 */ public static void main(String[] args) { try{ //创建JobDetail,JobDetail可以理解为任务的信息 JobDetail jobDetail=new JobDetail("job1", "group1", SimpleJob.class); //创建SimpleTrigger触发器,并设置时间触发规则 SimpleTrigger simpleTrigger=new SimpleTrigger("trigger1","tgroup1"); simpleTrigger.setStartTime(new Date()); simpleTrigger.setRepeatInterval(2000); simpleTrigger.setRepeatCount(10); //创建调度器 SchedulerFactory schedulerFactory=new StdSchedulerFactory(); Scheduler scheduler=schedulerFactory.getScheduler(); //注册触发器与任务 scheduler.scheduleJob(jobDetail, simpleTrigger); //启动调度器 scheduler.start(); //用于测试 try { // wait 90 seconds to show jobs Thread.sleep(90L * 1000L); // executing... } catch (Exception e) { } scheduler.shutdown(true);//job执行完毕后,关闭调度器 }catch (Exception e) { e.printStackTrace(); } }

     

    与spring的集成

    实现Job接口定义任务:

    public class SimpleJob implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { JobDataMap jobDataMap=jobExecutionContext.getJobDetail().getJobDataMap(); //获取spring ApplicationContext 的引用 ApplicationContext applicationContext=(ApplicationContext) jobDataMap.get("applicationContext"); System.out.println(jobExecutionContext.getTrigger().getName() + " triggered.time is :" + new Date()); System.out.println("timeout is :"+jobDataMap.getInt("timeout"));//访问JobDataMap中的属性 System.out.println("applicationContext is :"+applicationContext); } }

    在spring配置文件中进行配置:

    <!-- 配置job --> <bean id="simpleJob" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass" value="cn.enjoylife.quartz.job.SimpleJob" /> <!-- 为任务对应的JobDataMap提供值 --> <property name="jobDataAsMap"> <map> <entry key="timeout" value="5" /> </map> </property> <!--配置 spring ApplicationContext --> <property name="applicationContextJobDataKey" value="applicationContext"/> </bean> <!-- 配置trigger --> <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <!-- see the example of method invoking job above --> <property name="jobDetail" ref="simpleJob" /> <!-- 1 seconds --> <property name="startDelay" value="1000" /> <!-- repeat every 5 seconds --> <property name="repeatInterval" value="5000" /> </bean> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="simpleJob" /> <!-- run every morning at 6 AM --> <property name="cronExpression" value="0 0 6 * * ?" /> </bean> <!-- 配置调度器 --> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="simpleTrigger" /> <ref bean="cronTrigger"/> </list> </property> </bean>

     

    在多数情况下应该使用CronTrigger触发器,结合Cron表达式与Calendar,Calendar有一些实现类,如AnnualCalendar,MonthlyCalendar,WeeklyCalendar分别针对每年,每月和每周进行定义;此外在构造Trigger时可以使用TriggerUtils工具类,它提供了很多常用的Trigger方法。

     

    Quartz可以持久化任务调度信息,将这些信息保存到数据库中。

     

    参考

    spring企业应用开发详解

    spring framework 开发参考手册     集成quartz部分

    最新回复(0)