这个是整个项目的结构,以及所对应的jar包,
然后是这个.编写工作的类。代码很简单:
package cn.itcast.service;
import java.util.Date;
/*
* 使用spring+Quartz执行任务调度的具体类
* */
public class Job1 {
/*
* Description:具体工作的方法,此方法只是向控制台输出当前时间,
* 输入的日志在:%tomcatRoot%\logs\tomcat7-stdout.yyyy-MM-dd.log中,
* 其中,yyyy-MM-dd为部署的日期,经试验发现默认情况下并不是每天都生成一个stdout的日志文件
* @return 返回void
* */
public void work()
{
System.out.println("当前时间:"+new Date().toString()+"你好啊");
}
}//End of MyJob
配置web.xml,具体配置文件如下
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>SpringScheduleTask</display-name>
<!-- needed for ContextLoaderListener -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:application-context.xml</param-value>
</context-param>
<!-- Bootstraps the root web application context before servlet initialization -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
5.配置applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- 工作的bean -->
<bean id="myJob" class="cn.itcast.service.Job1" />
<!-- job的配置开始 -->
<bean id="myJobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="myJob" />
</property>
<property name="targetMethod">
<value>work</value>
</property>
</bean>
<!-- job的配置结束 -->
<!-- 调度的配置开始 -->
<bean id="crontestJobTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail">
<ref bean="myJobDetail" />
</property>
<property name="cronExpression">
<value>0/1 * * * * ?</value>
</property>
</bean>
<!-- 调度的配置结束 -->
<!-- 启动触发器的配置开始 -->
<!-- 总管理类如果将lazy-init='false'那么容器启动就会执行调度程序 -->
<bean name="startQuertz" lazy-init="false" autowire="no"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="crontestJobTrigger" />
</list>
</property>
</bean>
<!-- 启动触发器的配置结束 -->
</beans>
6.在Tomcat中调试,即可在Console窗口看到输出
在测试的过程中遇到了这样的问题
下面是遇到的问题和这个解决方案
使用Spring配置管理Quartz的时候会遇到下面的异常:
- Caused by: java.lang.IncompatibleClassChangeError: class org.springframework.scheduling.quartz.CronTriggerBean has interface org.quartz.CronTrigger as super class
原因是Spring 3.0版本中内置的Quartz版本是<2.0的,在使用最新的Quartz包(>2.0)之后,接口不兼容。
解决办法有两种:
1.降低Quartz版本,降到1.X去。
2.升级Spring版本到3.1+,根据Spring的建议,将原来的**TriggerBean替换成**TriggerFactoryBean,例如CronTriggerBean 就可以替换成 CronTriggerFactoryBean。替换之后问题解决。
2014-04-22补充解决办法:
解决办法有三种:
1.降低Quartz版本,降到1.X去。
2.升级Spring版本到3.1+,根据Spring的建议,将原来的**TriggerBean替换成**TriggerFactoryBean,例如CronTriggerBean 就可以替换成 CronTriggerFactoryBean。替换之后问题解决。
3.如果不在xml配置文件中引用 Spring 3.0 是支持 Quartz2.2.1(目前最新版本),直接在程序中调用即可。(我们的文件中转站系统用的是 Spring 3.0+quartz 2.2.1集群模式)
2012-04-27下面我们来看一下服务器端运行测试程序:
测试环境 2个Tomcat+Terracotta 集群 + Weblogic 共用 Quartz 2.2.1 集群