版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28643437/article/details/81234575
1:Quartz:需要引入jar包quartz-2.2.3.jar、quartz-jobs-2.2.3.jar
一、首先在spring中配置
<!-- 定义调用的对象及对象中的方法 -->
<bean id="jobDetail1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject"> <bean class="com.operator.task.testTask"/> </property> <!-- 定时对象 -->
<property name="targetMethod" value="test"/> <!-- 定时对象中的执行方法 -->
<property name="concurrent" value="false"/> <!-- 是否支持并发 -->
</bean>
<!-- 触发器:定义出发器执行的脚本的时间 -->
<bean id="simple"
class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail" ref="jobDetail1"/>
<property name="startDelay" value="3000"/> <!-- 项目启动多久毫秒后执行 -->
<property name="repeatInterval" value="3000"/> <!-- 每隔多少毫秒执行 -->
</bean>
<!-- 总管理类,启动触发器的配置, 如果将lazy-init='false'那么容器启动就会执行调度程序 -->
<bean name="xxxTask" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="simple"/> <!-- 可以配置多个 -->
</list>
</property>
</bean>
二、要在web.xml监听一下
<listener>
<listener-class>com.operator.common.ShutdownQuartz</listener-class>
</listener>
三、监听类 (每次重启tomcat的时候关掉上次的定时任务)
public class ShutdownQuartz implements ServletContextListener {
private final static Logger log = Logger.getLogger(ShutdownQuartz.class);
@Override
public void contextDestroyed(ServletContextEvent arg0) {
try {
ApplicationContext ac = SpringContext.getApplicationContext();
Scheduler scheduler = (Scheduler) ac.getBean("xxxTask");
scheduler.shutdown(true);
} catch (Exception e) {
log.error(e);
}
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
}
}
2:Timer:
一、开启监听
<listener>
<listener-class>com.operator.struts.action.xxxListener</listener-class>
</listener>
二、监听类
public class xxxListener implements ServletContextListener {
private Timer timer = null;
//每12个小时执行一次
private static long L_EXE_TIME = 12*60*60*1000L;
@Override
public void contextDestroyed(ServletContextEvent arg0) {
if(timer!=null){
timer.cancel();
}
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
startTask(L_EXE_TIME);
}
/**
* 循环执行任务
* @param myTask 要执行的任务
* @param dayInterval 每隔多少天执行一次任务
* @author xxx
* @since 20180529
* */
public void startTask(long dayInterval){
if(timer==null){
timer = new Timer(true);
}
timer.schedule(new xxxTools(), 0, dayInterval);
}
}
三、任务类
public class xxxTools extends TimerTask {
@Override
public void run() {
// Date bD= new Date();
doDhcpdata();
//Date eD= new Date();
//logger.info(" 本次数据处理: "+((eD.getTime()-bD.getTime())/1000)+"秒");
}
/**
* 定时执行任务
* @since 20180529
* @author xxx
*/
public static void doDhcpdata() {
}
}
精确度和功能
Quartz可以通过cron表达式精确到特定时间执行,而TimerTask不能。Quartz拥有TimerTask所有的功能,而 TimerTask则没有。Quartz每次执行任务都创建一个新的任务类对象,而TimerTask则每次使用同一个任务类对象。Quartz的某次执行任务过程中抛出异常,不影响下一次任务的执行,当下一次执行时间到来时,定时器会再次执行任务;而TimerTask则不同,一旦某个任务在执行过程中抛出异常,则整个定时器生命周期就结束,以后永远不会再执行定时器任务