巴拉巴拉
小魔仙

Quartz单独使用| Quartz与Spring结合使用| Quartz和Hibernate的调度

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;
    }

}
赞(0) 打赏
如果文章对你有帮助,欢迎你来评价反馈。AgainFly » Quartz单独使用| Quartz与Spring结合使用| Quartz和Hibernate的调度
标签:

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  • Q Q(选填)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏