Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。
quartz的单独使用。
首先我们需要一个工作的类,里面将用来执行我们需要的循环工作。
package quartz; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.Job; import org.quartz.JobDataMap; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SimpleJob implements Job{ private Logger logger=LoggerFactory.getLogger(SimpleJob.class); @Override public void execute(JobExecutionContext jobCtx) throws JobExecutionException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); JobDataMap properties=jobCtx.getJobDetail().getJobDataMap(); System.out.println("now\t\t\t" + sdf.format(new Date())); System.out.println("Previous fire time: \t"+sdf.format(jobCtx.getPreviousFireTime())); System.out.println("curent file time: \t"+sdf.format(jobCtx.getFireTime())); System.out.println("next fire time: \t"+sdf.format(jobCtx.getNextFireTime())); System.out.println("================================================"); } }
现在,我们启用一个main函数来调用这段工作代码。
package quartz; import org.quartz.CronScheduleBuilder; import org.quartz.CronTrigger; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerFactory; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; public class CronTriggerRunner { public static void main(String[] args) { try { JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class).withIdentity("myjob", "job-group").build(); CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("cronTrigger", "trigger-group") .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?")) .build(); SchedulerFactory sFactory = new StdSchedulerFactory(); Scheduler scheduler = sFactory.getScheduler(); scheduler.scheduleJob(jobDetail, cronTrigger); scheduler.start(); } catch (Exception e) { e.printStackTrace(); } } }
最后,我们来查看控制台的打印情况。
now 2016-03-17 20:24:45 Previous fire time: 2016-03-17 20:24:40 curent file time: 2016-03-17 20:24:45 next fire time: 2016-03-17 20:24:50 ================================================ now 2016-03-17 20:24:50 Previous fire time: 2016-03-17 20:24:45 curent file time: 2016-03-17 20:24:50 next fire time: 2016-03-17 20:24:55 ================================================ now 2016-03-17 20:24:55 Previous fire time: 2016-03-17 20:24:50 curent file time: 2016-03-17 20:24:55 next fire time: 2016-03-17 20:25:00 ================================================
======================================================================
我们可能会需要让quartz配合Spring使用。
那么首先我们也需要一个工作类,或者说这个工作类中的一个方法即可。我们不在需要这个类和上面一样来实现Job接口,并且重写execute方法,只需要指定某个方法即可。
package quartz; import java.text.SimpleDateFormat; import java.util.Date; /** * Created by Jecced on 2016/3/16 */ public class TestJob { public void display(){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(sdf.format(new Date())); } }
然后我们需要在ApplicationContext.xml中配置需要的Bean
<!-- 1.配置任务事件 2.配置定时器任务 3.定时器触发器 4.开启定时任务 --> <bean id="testJob" class="quartz.TestJob" /> <bean id="methodInvokingJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="testJob"/> <property name="targetMethod" value="display"/> </bean> <!-- 如果使用quartz2.x则需要使用Spring3.1+,并且将Bean改成CronTriggerFactoryBean --> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="methodInvokingJobDetail"/> <property name="startDelay" value="2000"/> <property name="cronExpression" value="0/5 * * * * ?"/> </bean> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false"> <property name="triggers"> <list> <ref bean="cronTrigger" /> </list> </property> </bean>
2016-03-18 08:49:05 2016-03-18 08:49:10 2016-03-18 08:49:15 2016-03-18 08:49:20 2016-03-18 08:49:25
==================================================================
我在使用quartz的时候,和Hibernate配合发生了一个困扰了一天的时间,那就是工作中对Hibernate调度是不行的。系统会报错,主要是因为Hibernate的事务没有绑定到当前线程。
那么稍微改了一下applicationContext.xml和工作类。
<bean id="hibernateInterceptor" class="org.springframework.orm.hibernate3.HibernateInterceptor"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager" ref="transactionManager"/> <property name="transactionAttributes"> <props> <prop key="save*">PROPAGATION_REQUIRED</prop> <prop key="remove*">PROPAGATION_REQUIRED</prop> <prop key="update*">PROPAGATION_REQUIRED</prop> <prop key="create*">PROPAGATION_REQUIRED</prop> <prop key="*">PROPAGATION_REQUIRED,readOnly</prop> </props> </property> <property name="preInterceptors"> <list> <ref bean="hibernateInterceptor"/> </list> </property> </bean> <!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 --> <bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="icsFlightDownTime"/> </list> </property> </bean> <bean id="jobWork" parent="txProxyTemplate"> <property name="target"> <bean class="quartz.Worker"> <property name="sessionFactory" ref="sessionFactory" /> </bean> </property> </bean> <!-- 定义调用对象和调用对象的方法 --> <bean id="icsFlightDownJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!-- 调用的类 --> <property name="targetObject" ref="jobWork"/> <!-- 调用类中的方法 --> <property name="targetMethod" value="display"/> </bean> <!-- 定义触发时间 --> <bean id="icsFlightDownTime" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="icsFlightDownJob"/> <!-- 十秒钟--> <property name="cronExpression" value="0/10 * * * * ?"/> <!-- 十分钟 --> <!--<property name="cronExpression" value="0 0/10 * * * ?"/>--> </bean>
在工作类中添加sessionFactory
public class Worker{ private SessionFactory sessionFactory; public void display(){ } public SessionFactory getSessionFactory() { return sessionFactory; } public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } }
最新评论