第一个 定时任务中遇到的问题

时间:2020-12-31 07:46:48

有个任务是每天凌晨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