一、jar 包 quartz 1.5.2.jar
参考文档:http://www.blogjava.net/baoyaer/articles/155645.html
二、quartz实现
1.关键API
- Scheduler - 与scheduler交互的主要API;
- Job - 你通过scheduler执行任务,你的任务类需要实现的接口;
- JobDetail - 定义Job的实例;
- Trigger - 触发Job的执行;
- Calendar - 日历指定时间点的集合,annualCalendar、monthlyCalendar、weeklyCalendar 对每年、每月、每周的定义
job代码实现
<span style="background-color: rgb(255, 204, 51);">定时任务实现</span>
public static void main(String[] args)
{
try
{
//①创建一个JobDetail实例,指定Job
JobDetail jobDetail = new JobDetail("job1", "jGroup1",UploadKeywordJob.class);
//②通过CronTrigger定义调度规则:每天几点上传
CronTrigger cronTrigger = new CronTrigger("trigger1","tGroup1");
cronTrigger.setCronExpression("0 0 9 ? * *");
//③通过SchedulerFactory获取一个调度器实例
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
//④ 注册并进行调度
scheduler.scheduleJob(jobDetail, cronTrigger);
//⑤调度启动
scheduler.start();
//*
}
catch (Exception se)
{
se.printStackTrace();
}
}
注:对于上面*号处让主线程睡眠原因没搞清楚,试过不加正常运行
使用Calendar,排除特定日期
①法定节日是以每年为周期的,所以使用AnnualCalendar
AnnualCalendar holidays = new AnnualCalendar();
②五一劳动节
Calendar laborDay = new GregorianCalendar();
laborDay.add(Calendar.MONTH,5);
laborDay.add(Calendar.DATE,1);
holidays.setDayExcluded(laborDay, true); ②-1:排除的日期,如果设置为false则为包含
③国庆节
Calendar nationalDay = new GregorianCalendar();
nationalDay.add(Calendar.MONTH,10);
nationalDay.add(Calendar.DATE,1);
holidays.setDayExcluded(nationalDay, true);③-1:排除该日期
scheduler.addCalendar("holidays", holidays, false, false);④向Scheduler注册日历
二、spring的定时任务的实现
1.spring中的quartz
- <!-- Timer schedule -->
- <!--要调度的对象-->
- <bean id="jobBean" class="net.xsbiz.common.MakeHtml" />
- <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
- <property name="targetObject" ref="jobBean" />
- <property name="targetMethod" value="execute" />
- <!--将并发设置为false-->
- <property name="concurrent" value="false" />
- </bean>
- <bean id="trigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
- <property name="jobDetail" ref="jobDetail" />
- <!--表达式,我的是每 30 执行一次-->
- <property name="cronExpression" value="0/30 * * * * ?" />
- </bean>
- <!-- 总管理类如果将lazy-init='false'那么容器启动就会执行调度程序 -->
- <bean id="startQuertz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false" >
- <property name="triggers">
- <list>
- <!--作业调度器,list下可加入其他的调度器-->
- <ref bean="trigger" />
- </list>
- </property>
- </bean>
web.xml:
- <!-- 设置Spring的监听,项目启动时候初始化 -->
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
- <!-- 指定Spring配置文件的路径 -->
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>/WEB-INF/classes/applicationContext.xml</param-value>
- </context-param>
MakeHtml.java :
- //调用的类
- public class MakeHtml {
- //调用的方法
- public void execute(){
- //需要做的事情
- }
- public static void main(String[] args) {
- System.out.println("----begin---");
- ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
- // 如果配置文件中将startQuertz bean的lazy-init设置为false 则不用实例化
- context.getBean("startQuertz");
- System.out.print("----end---");
- }
- }