Quartz整理
来源:互联网 发布:小米note 顶配版我知乎 编辑:程序博客网 时间:2024/06/14 02:45
Quartz简介
<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>
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表达式由6或7个由空格分隔的时间字段组成,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 整合
<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并配置(Batchjob(HelloWorld))
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>
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>
- Quartz整理
- Quartz常用方法整理
- Quartz资源整理
- Quartz.NET触发器错过的解决方法整理
- [整理]在 Web App 中使用 Quartz 替换 Java 定时器
- Quartz
- quartz
- Quartz
- Quartz
- quartz
- quartz
- quartz
- Quartz
- Quartz
- Quartz
- Quartz
- Quartz
- Quartz
- codeforces 732F 双联通分量
- nginx rewrite 指令
- 系统中的DEP功能
- html中 让 ul 的多个 li 在一行内显示
- 关于绝对路径和相对路径(啥啥未定义或者找不到神码目录)
- Quartz整理
- (转)美国进入智能投顾竞争时代
- Spring MVC入门
- Javascript模块化编程(二):AMD规范
- 最长公共子串 Longest Common SubString
- tensorflow batch normalization
- js 遮罩层 loading 效果
- 基于 SailingEase WinForm Framework 开发优秀的客户端应用程序(3:实现菜单/工具栏按钮的解耦及状态控制)
- [Leetcode] Remove Nth Node From End of List