Spring3.0
一.Spring Bean 注入作业调度的两种方式
方式一:@1、Spring使用JobDetailBean类,继承QuartzJobBean,重写
protected void executeInternal(JobExecutionContext context)方法
@2、 或实现Job接口,在execute方法中调用执行任务
方式二:Spring使用MethodInvokingJobDetailFactoryBean,普通Java类都可
注:方式一保存在数据库中,方式二在内存中处理。
方式一实现:
quartz.properties配置文件:
#==============================================================
#Configure Main Scheduler Properties
#==============================================================
org.quartz.scheduler.instanceName =myQuartz #唯一标示
org.quartz.scheduler.instanceId = AUTO
#==============================================================
#Configure JobStore QRTZ_ quartz表的前缀
#==============================================================
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.tablePrefix = QRTZ_
#
org.quartz.jobStore.isClustered =true
org.quartz.jobStore.clusterCheckinInterval = 20000
org.quartz.jobStore.dataSource = myDS
org.quartz.jobStore.useProperties=true
#==============================================================
#Configure DataSource 数据库配置信息
#==============================================================
org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver
org.quartz.dataSource.myDS.URL = jdbc:mysql://192.168.0.50:3306/acdb
org.quartz.dataSource.myDS.user = ac
org.quartz.dataSource.myDS.password =ac
#org.quartz.dataSource.myDS.driver = oracle.jdbc.driver.OracleDriver
#org.quartz.dataSource.myDS.URL = jdbc:oracle:thin:@127.0.0.1:1521:orcl
#org.quartz.dataSource.myDS.user = hf
#org.quartz.dataSource.myDS.password = hf
org.quartz.dataSource.myDS.maxConnections = 30
#==============================================================
#Configure ThreadPool
#==============================================================
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
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"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
">
<!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 -->
<bean id="acWarehouseSchedulerFactoryBean" lazy-init="false"
autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="deleteZipTrigger" />
</list>
</property>
<property name="applicationContextSchedulerContextKey" value="applicationContext" />
<property name="configLocation" value="classpath:quartz.properties" />
</bean>
<!-- 定义调用对象和调用对象的方法 -->
<bean id="deleteZipJobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass">
<value>com.xlwzsoft.acWarehouse.quartz.UpdateFromACDBClusterQuartzJobBean
</value>
</property>
<property name="jobDataAsMap">
<map>
<entry key="targetObject" value="deleteZipJob" />
<entry key="targetMethod" value="execute" />
</map>
</property>
</bean>
<!-- every hour -->
<!-- 定义触发时间 -->
<bean id="deleteZipTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="deleteZipJobDetail" />
</property>
<property name="cronExpression">
<value>59 59 * * * ?</value>
<!-- <value>0 0/3 * * * ?</value> -->
</property>
</bean>
<!-- 要调用的工作类 -->
<bean id="deleteZipJob" class="com.xlwzsoft.acWarehouse.quartz.TaskTestBean">
</bean>
</beans>
com.xlwzsoft.acWarehouse.quartz.UpdateFromACDBClusterQuartzJobBean类文件:
//@1步骤
public class UpdateFromACDBClusterQuartzJobBean extends QuartzJobBean {
protected final Log logger = LogFactory.getLog(getClass());
private String targetObject;
private String targetMethod;
private ApplicationContext ctx;
@Override
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
try {
System.out.println("ac ---execute [" + targetObject + "] at once1111111111111>>>>>>");
Object otargetObject = ctx.getBean(targetObject);
Method m = null;
try {
m = otargetObject.getClass().getMethod(targetMethod, new Class[] {JobExecutionContext.class});
m.invoke(otargetObject, new Object[] {context});
} catch (SecurityException e) {
logger.error(e);
} catch (NoSuchMethodException e) {
logger.error(e);
}
} catch (Exception e) {
throw new JobExecutionException(e);
}
}
public void setApplicationContext(ApplicationContext applicationContext) {
this.ctx = applicationContext;
}
public void setTargetObject(String targetObject) {
this.targetObject = targetObject;
}
public void setTargetMethod(String targetMethod) {
this.targetMethod = targetMethod;
}
}
TaskTestBean类文件:
//@2步骤
public class TaskTestBean implements Job ,Serializable {
private static final long serialVersionUID = 4937479059845599009L;
private static final Logger logger = Logger.getLogger(TaskTestBean.class);
public TaskTestBean(){
}
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
logger.info("-----------进入自动任务------------");
logger.info("-----------此次自动任务结束------------");
}
}
方式二:
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"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
">
<!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 内存中处理 -->
<bean id="startQuartz" lazy-init="false" autowire="no"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="deleteZipTrigger" />
</list>
</property>
</bean>
<!-- 定义调用对象和调用对象的方法 内存中处理 -->
<bean id="deleteZipJobDetail2"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 调用的类 -->
<property name="targetObject">
<ref bean="updateFromAcDataZip" />
</property>
<!-- 调用类中的方法 -->
<property name="targetMethod">
<value>work</value>
</property>
</bean>
<!-- every hour -->
<!-- 定义触发时间 -->
<bean id="deleteZipTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="deleteZipJobDetail2" />
</property>
<property name="cronExpression">
<value>59 59 * * * ?</value>
<!-- <value>0 0/3 * * * ?</value> -->
</property>
</bean>
<!-- 要调用的工作类 内存处理 -->
<bean id="updateFromAcDataZip" class="com.xlwzsoft.acWarehouse.quartz.UpdateFromAcDataZip">
</bean>
</beans>
UpdateFromAcDataZip类文件:
public class UpdateFromAcDataZip {
private static final Logger logger = Logger.getLogger(TaskTestBean.class);
public UpdateFromAcDataZip(){
}
public void work(){
logger.info("-----------进入自动任务- work!!!-----------");
logger.info("-----------此次自动任务结束------------");
}
}
注:方式2的配置可以作为外部文件导入到applicationContext.xml中去。
测试方法二:
public static void main(String[] args) {
System.out.println("----------Test start.-------\n");
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-jobs.xml");
//如果配置文件中将startQuertz bean的lazy-init设置为false 则不用实例化
context.getBean("startQuartz");
}
注:cron表达式
附上corn语法及示例
corn=[秒 分 时 日 月 周 年]
一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素。
按顺序依次为
秒(0~59)
分钟(0~59)
小时(0~23)
天(月)(0~31,但是你需要考虑你月的天数)
月(0~11)
天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
7.年份(1970-2099)
其中每个元素可以是一个值(如6),一个连续区间(9-12),一个间隔时间(8-18/4)(/表示每隔4小时),一个列表(1,3,5),通配符。由于"月份中的日期"和"星期中的日期"这两个元素互斥的,必须要对其中一个设置?.
0 0/3 * * * ? 每隔三分钟执行一次
59 59 * * * ?每小时执行一次 正好为59分59秒的时候执行
0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时
0 0 12 ? * WED 表示每个星期三中午12点
"0 0 12 * * ?" 每天中午12点触发
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
"0 15 10 15 * ?" 每月15日上午10:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发
参考连接:http://www.open-open.com/lib/view/open1354666663304.html