Quartz整理

来源:互联网 发布:小米note 顶配版我知乎 编辑:程序博客网 时间:2024/06/14 02:45

Quartz简介

•Quartzis a richly featured, open source job scheduling library that can beintegrated within virtually any Java application - from the smalleststand-alone application to the largest e-commerce system.
•Quartz是一个开源的定时任务库,可以和任何一个Java项目集成。


maven:
<dependency>      <groupId>org.quartz-scheduler</groupId>      <artifactId>quartz</artifactId>      <version>2.2.1</version>  </dependency>  <dependency>      <groupId>org.quartz-scheduler</groupId>      <artifactId>quartz-jobs</artifactId>      <version>2.2.1</version>  </dependency>


HelloWorld:
public void sayHelloWorld() throws Exception{// 获取Scheduler实例Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();scheduler.start();JobDetail job = JobBuilder.newJob(HelloWorldJob.class).withIdentity("job1", "group1").build();// 触发时间点SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(5).repeatForever();//SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule()//.withIntervalInSeconds(5).withRepeatCount(2);Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")        .startNow().withSchedule(simpleScheduleBuilder).build();//CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/3 * * * * ? ");//Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")//        .withSchedule(cronScheduleBuilder).build();// 交由Scheduler安排触发scheduler.scheduleJob(job, trigger);//为观察程序运行,此设置主程序睡眠1分钟才继续往下运行(因下一个步骤是“关闭Scheduler”) try {        TimeUnit.MINUTES.sleep(1);     } catch (InterruptedException e) {          e.printStackTrace();        }// 关闭Schedulerscheduler.shutdown();}

Cron表达式:

Quartz使用类似于Linux下的Cron表达式定义时间规则,Cron表达式由67个由空格分隔的时间字段组成,cron表达式从左往右分别代表秒、分、时、天、月、星期、年,因为最后一位年可以不写,所以是6位或7位,



表示and             

“-”表示一个区间段,即开始到结束            

 “*”表示全

 “/”表示一个区间段的时长,例如放在第一位“/10”则表示每10         

L”表示最后,Last   

“W表示weekday即周一周五   

 C”表示canlendar,即日历,例如“1C”在星期位上就是包括日历上的星期日       

“#”表示序列,如“#2”表示第二



表达式

表达的时间

0 0 12 * * ?

每天中午12点

0 * 14 * * ?

每天下午14点钟开始到14点59分结束这么一个时间段

0 0/5 14 * * ?

每天下午14点到14点55分之间每5分钟触发一次

0 10,44 14 ? 3 WED

每年三月份的每个周三下午14点10分和14点44各一次

0 15 10 L * ?

每个月最后一天的10点15分

0 15 10 ? * 6#3

每个月的第三个周五的10点15分

0 0 12 1/5 * ?

每个月从第一天开始每隔5天中午12点触发一次



Job间数据传递和共享:(JobDataMap

1、在生成JobDetail时,往Map中放入数据

JobDetail job = JobBuilder.newJob(HelloWorldJob.class).withIdentity("job1", "group1").usingJobData("count", 0).build();

2、在Job实现类中,通过JobDetail取得数据

int count = (int)arg0.getJobDetail().getJobDataMap().get("count");arg0.getJobDetail().getJobDataMap().put(“count”, count);//更新数据


Quartz 与 Spring整合

•整合步骤:

  (1)配置Job(有两种方式)

  (2)配置触发器(CronTriggerFactoryBean)

  (3)配置调度工厂(SchedulerFactoryBean)


方式一:

1)编写HelloWorld类,无须继承父类

public class HelloWorld {    private  int counter = 0;      public void sayHello(){System.out.println("HelloWorld " + (counter++) + " 次执行。。。");}}

2配置MethodInvokingJobDetailFactoryBean,需指定两个属性

<!-- 定义目标bean和bean中的方法 -->      <bean id="HelloWorld" class="com.sds.job.HelloWorld" />      <bean id="HelloWorldJob1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">      <property name="targetObject">              <ref bean="HelloWorld"/>      </property>     <property name="targetMethod">  <!-- 要执行的方法名称 -->          <value>sayHello</value>      </property>       </bean>

方式二:

1)创建Job类,一定要继承QuartzJobBean

public class HelloWorld2 extends QuartzJobBean{@Override    protected void executeInternal(JobExecutionContext context)throws JobExecutionException {       int count = context.getJobDetail().getJobDataMap().getInt("count");       System.out.println("这是第 " + (count) +"次执行 helloworld2");                context.getJobDetail().getJobDataMap().put("count", count+1);; }

2)配置JobDetailFactoryBean

<bean id="jobdetail2" class="org.springframework.scheduling.quartz.JobDetailFactoryBean" >    <property name="jobClass" value="com.sds.job.HelloWorld2"></property>    <property name="jobDataAsMap" ><map>    <entry key="count" value="0"></entry></map>     </property></bean>


配置调度触发器(CronTriggerFactoryBean

<bean id="CronTrigger1" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">      <property name="jobDetail" ref=“HelloWorldJob1"></property>      <property name="cronExpression" value="0/5 * * * * ?"></property>  </bean> <bean id="cronTrigger2"   class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">      <property name="jobDetail" ref="HelloWorldJob2"></property>    <property name="cronExpression" value="0/5 * * * * ?"></property></bean>

配置调度工厂


<bean id="SpringJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">      <property name="triggers">          <list>              <ref bean="CronTrigger1"/>             <ref bean="cronTrigger2"/>          </list>      </property>  </bean> 

Quartz 与 Spring Batch 整合

•Quartz和SpringBatch的区别
-SpringBatch 是一款批处理应用框架,不是调度框架,更多地关注核心的业务处理过程
-Quartz是一个成熟的调度框架,可以帮助我们定期执行批处理


1.配置spring batch,关键配置如下:

<bean id="jobLauncher"class="org.springframework.batch.core.launch.support.SimpleJobLauncher"><property name="jobRepository" ref="jobRepository" /></bean><bean id="jobRepository"class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean" /><bean id="transactionManagerBatch"class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />    <bean id="jobRegistry" class="org.springframework.batch.core.configuration.support.MapJobRegistry"/>    <bean class="org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor"><property name="jobRegistry" ref="jobRegistry"/></bean>

2.编写Batchjob并配置(BatchjobHelloWorld))
public class SayHello implements Tasklet{    private String message;    public void setMessage(String message) {        this.message = message;    }public String getMessage() {return message;} @Overridepublic RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {System.out.println(message);        return RepeatStatus.FINISHED;}}

<batch:job id="batchhelloWorldJob" >        <batch:step id="step_hello" next="step_world">            <tasklet ref="hello" transaction-manager="transactionManagerBatch"></tasklet>        </batch:step>        <batch:step id="step_world">            <tasklet ref="world" transaction-manager="transactionManagerBatch"></tasklet>        </batch:step>    </batch:job>     <bean id="hello" class="com.sds.job.SayHello">        <property name="message" value="Hello "></property>    </bean>     <bean id="world" class="com.sds.job.SayHello">        <property name="message" value=" World!"></property>    </bean>

•3.编写并配置QuartzJob

-QuartzJob 需要继承 QuartzJobBean
-成员变量:
private String jobName;     //对应batch job private JobLocator jobLocator;private JobLauncher jobLauncher;

QuartzJob中通过jobLocator获取batch,通过jobLauncher运行batch

Quartzjob 配置:


<bean id=" quartzjob " class="org.springframework.scheduling.quartz.JobDetailFactoryBean"><property name="jobClass" value="com.sds.job.BatchJob"></property><property name="jobDataAsMap"><map><entry key="jobName" value="batchhelloWorldJob" /><entry key="jobLauncher" value-ref="jobLauncher" /><entry key="jobLocator" value-ref="jobRegistry" />  </map></property></bean>

<bean id="CronTrigger3" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">      <property name="jobDetail" ref="quartzjob"></property>       <property name="cronExpression" value="0/5 * * * * ?"></property>  </bean>

<bean id="SpringJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">      <property name="triggers">          <list>              <ref bean="CronTrigger1"/>             <ref bean="cronTrigger2"/>             <ref bean="CronTrigger3"/>         </list>      </property>  </bean>    








0 0