Spring定时器初接触Spring+quartz
工作的时候遇到需要使用定时器的地方,要求晚上定时删除缓存文件夹下的文件.初步研究了一下Spring的定时器;
Spring的定时器选择的是Quartz,Spring使用Quartz需要有4个步骤
一、创建定时任务job
Quartz创建定时任务有两种方式,一个是继承类,继承:org.springframework.scheduling.quartz.QuartzJobBean类进行创建,另一个是直接创建一个普通的java类,在后面的步骤中指定定时方法,这个方式的耦合性低,推荐,我也是使用的这个方式.
创建java类作为定时任务:
package com.trs.project.task; import java.io.File; import org.apache.log4j.Logger; import com.databasesearch.util.ReadUtil; public class DeleteTempFile { Logger logger = Logger.getLogger(getClass()); private String path = ""; public String getPath() { return path; } public void setPath(String path) { this.path = path; } /** * 删除产生的临时文件 */ public void deleteTemp() { if (ReadUtil.isNotNull(path)) { delFile(path); } } private void delFile(String path) { File file = new File(path); if (file.exists()) { String[] tempList = file.list(); File temp = null; for (int i = 0; i < tempList.length; i++) { if (path.endsWith(File.separator)) { temp = new File(path + tempList[i]); } else { temp = new File(path + File.separator + tempList[i]); } if (temp.isFile()) { if(temp.delete()){ logger.info("删除缓存文件"+temp.getName()); } } } } } }
创建完任务后,在Spring中创建该bean
<!--定时删除temp文件夹下的文件 -->
<bean name="DeleteTempFile" class="com.trs.project.task.DeleteTempFile" init-method="deleteTemp">
<property name="path" value="D:\TRS\TRSWCMV7\Tomcat\temp" />
</bean>
二、配置JobDetail
<bean id="DeleteTempFilequartz"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="DeleteTempFile" />
<property name="targetMethod" value="deleteTemp" />
<!-- 是否允许任务并发执行。当值为false时,表示必须等到前一个线程处理完毕后才再启一个新的线程 -->
<property name="concurrent" value="false" />
</bean>
其中targetObject为上面创建的bean对象
targetMethod为执行的定时任务方法
三、配置触发器
<bean id="DeleteTempFilequartzTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="DeleteTempFilequartz" />
</property>
<property name="cronExpression">
<!--每天一点执行一次 -->
<value>* * 0 1 * ? </value>
</property>
</bean>
这边使用的cron触发器,还有一种触发器是org.springframework.scheduling.quartz.SimpleTriggerFactoryBean,这种触发器的写法为:
<bean id="exampleJobTrigger"
class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail" ref="DeletTempFilequartz" />
<!-- 延迟触发时间,延迟10秒进行触发 -->
<property name="startDelay" value="10000" />
<!-- 重复触发的时间间隔,5秒 -->
<property name="repeatInterval" value="5000" />
</bean>
cron触发器可以很灵活的配置触发时间,如上方写的 0 0 1 * * ? 依次为秒,分,时,月,星期,年具体可以看quartz的官方网站:http://www.quartz-scheduler.org/documentation/quartz-2.2.x/tutorials/crontrigger.html
四、配置SchedulerFactoryBean
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="DeleteTempFilequartzTrigger" />
</list>
</property>
<property name="autoStartup" value="true" />
</bean>
这样,配置定时器就完成了.