有个任务是每天凌晨1点要往十三个临时表插数据,然后将临时表的内容统计一下插入另一个临时表。
开始的时候使用spring 和 Quartz
配置 如下:
applicationContext.xml 配置 引入job.xml文件
job.xml配置 定义触发器Trigger
testJob.xml配置 定义任务实体bean
配置执行时间
指定 任务方法
配置好以后发现定时任务可以运行但是执行时间很长,于是就分开执行插入,配置多任务同时在1点执行,由于不知道如何用Quartz配置多任务,就spring task配置了多任务
首先要在applicationContext.xml中引入命名空间和xsd规范文件
applicationContext.xml配置
<context:component-scan base-package="itos.oss4g.job" />
<task:annotation-driven scheduler="myScheduler"/>
<task:scheduler id="myScheduler" pool-size="13"/>
定时任务类
@Component
public class CNetCompletedDetailJob {
Logger log = Logger.getLogger(CNetCompletedDetailJob.class);
SimpleDateFormat formatDate = new SimpleDateFormat("yyyy-MM-dd");
Date date = new Date();
public void exec() throws Exception{
}
@Scheduled(cron= "0 0 1 * * ?")
public void sztask(){
disposeData("ossrm_sz","temp_cjg_consumingtime_sz","temp_pso_count_sz","h_inf_send_msg_sz","h_return_msg_sz","sz","苏州",20);
}
。。。。。。
}
结果发现数据会重复插入四次,首先我检查了 testJob.xml文件,发现我之前配置的定时任务bean没有注释掉,注释掉之后,数据少了两次还会重复插入两次,检查了很久,都不知道原因,后来我大概知道表面的原因了,只要我用注解配置就会有插入两次,而用spring 的xml配置任务,把注解去掉就不会插入两次,配置如下:
配置bean
<bean id = "cwjgJOB" class = "itos.oss4g.job.CNetCompletedDetailJob "/>
配置任务驱动
<task:annotation-driven scheduler="myScheduler"/>
配置定时任务及缓冲池大小
<task:scheduler id="myScheduler" pool-size="13"/>
定时任务的运行时间
<task:scheduled-tasks scheduler="myScheduler">
<task:scheduled ref="cwjgJOB" method="sztask" cron="0 0 1 * * ?"/>
<task:scheduled ref="cwjgJOB" method="nttask" cron="0 0 1 * * ?"/>
<task:scheduled ref="cwjgJOB" method="wxtask" cron="0 0 1 * * ?"/>
<task:scheduled ref="cwjgJOB" method="cztask" cron="0 0 1 * * ?"/>
<task:scheduled ref="cwjgJOB" method="njtask" cron="0 0 1 * * ?"/>
<task:scheduled ref="cwjgJOB" method="zjtask" cron="0 0 1 * * ?"/>
<task:scheduled ref="cwjgJOB" method="hatask" cron="0 0 1* * ?"/>
<task:scheduled ref="cwjgJOB" method="lygtask" cron="0 0 1 * * ?"/>
<task:scheduled ref="cwjgJOB" method="yztask" cron="0 0 1 * * ?"/>
<task:scheduled ref="cwjgJOB" method="tztask" cron="0 0 1 * * ?"/>
<task:scheduled ref="cwjgJOB" method="xztask" cron="0 0 1 * * ?"/>
<task:scheduled ref="cwjgJOB" method="yctask" cron="0 0 1 * * ?"/>
<task:scheduled ref="cwjgJOB" method="sqtask" cron="0 0 1 * * ?"/>
</task:scheduled-tasks>
把任务类的注解去掉
public class CNetCompletedDetailJob {
Logger log = Logger.getLogger(CNetCompletedDetailJob.class);
SimpleDateFormat formatDate = new SimpleDateFormat("yyyy-MM-dd");
Date date = new Date();
public void exec() throws Exception{
}
public void sztask(){
disposeData("ossrm_sz","temp_cjg_consumingtime_sz","temp_pso_count_sz","h_inf_send_msg_sz","h_return_msg_sz","sz","苏州",20);
}
。。。。。。
}
结果就不会有重复数据了,后来我好像明白了,要用注解的话web.xml中不能同时配置 监听器ContextLoaderListener和拦截器DispatcherServlet
只需要配置监听器ContextLoaderListener就可以了。
上边的配置中使用了spring的上下文监听器,在这种情况下项目启动后,spring.xml中的定时任务配置才会生效。
详细配置可以参考
https://blog.csdn.net/tuzongxun/article/details/51576301