读书人

关于Spirng Quartz定时触发器+源码示范

发布时间: 2012-10-30 16:13:36 作者: rapoo

关于Spirng Quartz定时触发器+源码示例!

??? 最近实现了一个业务,刚好需要用到Spring 触发器,特写了一个Spring 触发器Demo供大家学习参考!

???? Demo简单的实现了定时报时功能,通过Spring 触发器实现每分钟报一次时间!

Demo结构如下:


关于Spirng Quartz定时触发器+源码示范


?运行结果如下:


关于Spirng Quartz定时触发器+源码示范

?

简单解释一下Quartz:

??? Quartz调度器为调度工作提供了更丰富的支持。和Java定时器一样,可以使用Quartz来每隔多少毫秒执行一个工作。但Quartz比Java Timer更先进之处在于它允许你调度一个工作在某个特定的时间或日期执行。关于Quartz的更多信息,可以访问Quartz位于http://www.opensymphony.com/quartz的主页。


在简单介绍下创建触发器的步骤:

??? 首先需要创建一个工作类,这个类必须继承Spring的QuartzJobBean

package jobs;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import org.springframework.scheduling.quartz.QuartzJobBean;import service.ITellingTheTimeService;/** * @ProjectName:报时Demo    * @ClassName:TellingTheTimeJob    * @Description:    * @author:Sheep * @date:2012-4-19 下午03:58:11    * @Modifier:  * @Modify Date:   * @Modify Note:    * @version */public class TellingTheTimeJob extends QuartzJobBean {private ITellingTheTimeService tellingTheTimeService = null;@Overrideprotected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {//调用报时方法this.tellingTheTimeService.tellingTheTime();}public ITellingTheTimeService getTellingTheTimeService() {return tellingTheTimeService;}public void setTellingTheTimeService(ITellingTheTimeService tellingTheTimeService) {this.tellingTheTimeService = tellingTheTimeService;}}

???? QuartzJobBean是Quartz中与Java的TimerTask等价的类。它实现了org.quartz.Job接口。executeInternal()方法定义了当预定的时刻来临时应该执行哪些动作。


接着我们须在Sping配置文件中声明这个Job。

<!-- 配置一个Job --><bean id="tellTheTimeJob" value="jobs.TellingTheTimeJob"/><property name="jobDataAsMap"><map><entry key="tellingTheTimeService" value-ref="tellingTheTimeService"></entry></map></property></bean>

??? JobDetailBean是Quartz的org.quartz.JobDetail的子类,它要求通过jobClass属性来设置一个Job对象。
??? 使用Quartz的JobDetail中的另一个特别之处是TellingTheTimeJob 的tellingTheTimeService 属性是间接设置的。JobDetail的jobDataAsMap属性接受一个java.util.Map,其中包含了需要设置给jobClass的各种属性。在这里,这个map包含了一个指向tellingTheTimeService的引用,它的键值为tellingTheTimeService 。当JobDetailBean实例化时,它会将tellingTheTimeService注入到TellingTheTimeJob 的tellingTheTimeService属性中。


??? 一个Job定义好了,那么我们怎么来实现触发器来调用这个Job呢?接着我们需要在Sping配置触发器。

??? Spring提供了两个触发器,SimpleTriggerBean和CronTriggerBean。

??? 我们现在看看SimpleTriggerBean是怎么配置的,如下:

<!-- 简单的触发器 --><bean id="simpleTellTheTimeTrigger" /></property><!-- 以毫秒为单位,启动后一分钟触发 --><property name="startDelay"><value>60000</value></property><!-- 每间隔一分钟触发一次 --><property name="repeatInterval"><value>60000</value></property></bean>

??? SimpleTriggerBean与ScheduledTimerTask类似。你可以用它来指定一个工作应该以怎样的频度运行,以及(可选地)在第一次运行工作之前应该等待多久。其中,jobDetail属性告诉触发器调度哪个工作。

??? 我们再来看看CronTriggerBean是怎么配置的,如下:

<!-- 复杂的触发器 --><bean id="complexTellTheTimeTrigger" name="code"><!-- Spring触发工厂 --><bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="triggers"><list><ref bean="complexTellTheTimeTrigger"/><!-- ....下面可以继续添加其他触发器 --></list></property></bean>

?? Spring的SchedulerFactoryBean是Quartz中与TimerFactoryBean等价的类。属性triggers接受一组触发器。因此只需简单地装配一个包含complexTellTheTimeTrigger的一个引用的即可。


??? 这里就实现了每分钟报一次时间的业务需求,下面附上源码(包含了所需的Jar包)供大家学习参考。

?

1 楼 shizhangliao 2012-04-21 怎么抱这个错误呢?
严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener
java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContextException 2 楼 resp 2012-04-23 shizhangliao 写道怎么抱这个错误呢?
严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener
java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContextException

不会吧,请问你用的JDK是什么版本? 3 楼 qq359907964 2012-05-31 java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContextException 报错啊... 4 楼 qq359907964 2012-05-31 把spring3的包都导入进去就不报错了 5 楼 gupeipei912 2012-06-25 LZ你那个后台运行在哪个类里面运行的,我怎么只打印一次,好像触发器每起作用!
6 楼 gupeipei912 2012-06-25 严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
java.lang.NoSuchMethodError: org.springframework.web.context.ConfigurableWebApplicationContext.setId(Ljava/lang/String;)V
at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:264)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:197)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4206)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4705)
at org.apache.catalina.startup.HostConfig.checkResources(HostConfig.java:1284)
at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1382)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:306)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142)
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1389)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1653)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1662)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1642)
at java.lang.Thread.run(Thread.java:619)
2012-6-25 10:40:56 org.apache.catalina.core.StandardContext start
严重: Error listenerStart
2012-6-25 10:40:56 org.apache.catalina.core.StandardContext start
严重: Context [/timerDemo2] startup failed due to previous errors
2012-6-25 10:40:56 org.apache.catalina.core.ApplicationContext log
信息: Closing Spring root WebApplicationContext

怎么报这个错?帮忙解决一下!谢了! 7 楼 gupeipei912 2012-06-25 嗯,问题已解决,是Spring jar包的问题! 8 楼 Wentasy 2012-07-15 gupeipei912 写道嗯,问题已解决,是Spring jar包的问题!
请问是怎么解决的? 9 楼 CNTMDCSDN 2012-09-14 楼主,出问题了:



信息: Starting Servlet Engine: Apache Tomcat/6.0.13
2012-9-14 21:06:34 org.apache.catalina.core.StandardContext listenerStart
严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener
java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContextException
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2389)
at java.lang.Class.getConstructor0(Class.java:2699)
at java.lang.Class.newInstance0(Class.java:326)
at java.lang.Class.newInstance(Class.java:308)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3771)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4334)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:920)
at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:883)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1138)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
at org.apache.catalina.core.StandardService.start(StandardService.java:516)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
at org.apache.catalina.startup.Catalina.start(Catalina.java:566)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
Caused by: java.lang.ClassNotFoundException: org.springframework.context.ApplicationContextException
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1358)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
... 29 more
2012-9-14 21:06:34 org.apache.catalina.core.StandardContext listenerStart
严重: Skipped installing application listeners due to previous error(s)
2012-9-14 21:06:34 org.apache.catalina.core.StandardContext start
严重: Error listenerStart
2012-9-14 21:06:34 org.apache.catalina.core.StandardContext start
严重: Context [/timerDemo] startup failed due to previous errors
2012-9-14 21:06:34 org.apache.coyote.http11.Http11Protocol start
信息: Starting Coyote HTTP/1.1 on http-8080
2012-9-14 21:06:34 org.apache.jk.common.ChannelSocket init
信息: JK: ajp13 listening on /0.0.0.0:8009
2012-9-14 21:06:34 org.apache.jk.server.JkMain start
信息: Jk running ID=0 time=0/15 config=null
2012-9-14 21:06:34 org.apache.catalina.startup.Catalina start
信息: Server startup in 456 ms
10 楼 resp 2012-09-17 CNTMDCSDN 写道楼主,出问题了:



信息: Starting Servlet Engine: Apache Tomcat/6.0.13
2012-9-14 21:06:34 org.apache.catalina.core.StandardContext listenerStart
严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener
java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContextException
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2389)
at java.lang.Class.getConstructor0(Class.java:2699)
at java.lang.Class.newInstance0(Class.java:326)
at java.lang.Class.newInstance(Class.java:308)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3771)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4334)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:920)
at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:883)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1138)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
at org.apache.catalina.core.StandardService.start(StandardService.java:516)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
at org.apache.catalina.startup.Catalina.start(Catalina.java:566)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
Caused by: java.lang.ClassNotFoundException: org.springframework.context.ApplicationContextException
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1358)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
... 29 more
2012-9-14 21:06:34 org.apache.catalina.core.StandardContext listenerStart
严重: Skipped installing application listeners due to previous error(s)
2012-9-14 21:06:34 org.apache.catalina.core.StandardContext start
严重: Error listenerStart
2012-9-14 21:06:34 org.apache.catalina.core.StandardContext start
严重: Context [/timerDemo] startup failed due to previous errors
2012-9-14 21:06:34 org.apache.coyote.http11.Http11Protocol start
信息: Starting Coyote HTTP/1.1 on http-8080
2012-9-14 21:06:34 org.apache.jk.common.ChannelSocket init
信息: JK: ajp13 listening on /0.0.0.0:8009
2012-9-14 21:06:34 org.apache.jk.server.JkMain start
信息: Jk running ID=0 time=0/15 config=null
2012-9-14 21:06:34 org.apache.catalina.startup.Catalina start
信息: Server startup in 456 ms


换个Tomcat试试,别把包忘记了!

读书人网 >编程

热点推荐