在web环境下,通常需要使用一些定时执行的操作(如定时报表生成,定期定时数据统计,定时短信发送等等) 。此时可以应用quartz调度器来实现。
spring与quartz集成使用。Quartz中对于spring的service方法调用注意区别以往的作业调度方式。
其他调度器的使用:
1、数据库自身调度任务,定时触发
2、继承TimerTask,实现run方法。
3、其他自己实现
简要介绍下spring与quartz集成使用:
1、实现类需要继承QuartzJobBean类,实现executeInternal方法即可
2、创建applicationContext-quartz.xml配置文件
具体内容如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 要调用的工作类 -->
<bean id="job" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="cn.com.xinli.radar.job.SendSmsJob"/>
<property name="jobDataAsMap">
<map>
<entry key="sendSmsService">
<ref bean="sendSmsService" />
</entry>
</map>
</property>
</bean>
<bean id="doTime" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="job"/>
<property name="cronExpression" value="0/3 * * * * ?"/>
</bean>
<!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 -->
<bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="doTime"/>
</list>
</property>
</bean>
</beans>
3、再web.xml文件中增加如下代码:
<servlet>
<display-name>Quartz Initializer Servlet</display-name>
<servlet-name>QuartzInitializer</servlet-name>
<servlet-class>
org.quartz.ee.servlet.QuartzInitializerServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
完成上面三个步骤,quartz调度器就ok啦,很简单。但是在实践中碰到2个问题,再编码时需要注意
1、当不需要与spring集成的话,可以让实现类直接继承 job类即可。与spring集成,我们需要在实现类中
调用spring的service方法,service方法通过IOC实现依赖注入,此时为了调用service方法,我们必须继承
QuartzJobBean类文件,并且参照配置文件applicationContext-quartz.xml中JobDetailBean部分的配
置将queryCustService注入。否则调度器实现类中无法调用service方法。
2、executeInternal方法内部可以调用service对象。但是实现类中其他抽象的private方法中无法调用
到service对象,必须通过executeInternal方法内部将service所谓参数传递至private方法内部方可使用。