问题描述:程序中有一个定时任务,每半个小时执行一次,按照规则生成假数据插入到数据库中,突然有一天查看数据库,每次都会有两条数据,数据还不一样,意识到是不是定时任务重复执行了,就去看了log日志,发现定时任务确实执行了两次。
定时任务代码如下:
/**
* 每30分钟执行一次
*/
@Scheduled(cron = "0 0/30 * * * ?")
private void configureTasks() {
log.info("*********填充数据定时任务开始执行*********");
//将所有需要生产假数据的项目都查出来
List<TaskInfo> taskInfoList = taskInfoService.list(new QueryWrapper<TaskInfo>().eq("status", 1));
Connection conn = null;
Statement stat = null;
try {
conn = DriverManager.getConnection(TableUtil.CONN_URL, TableUtil.USER, TableUtil.PASSWORD);
stat = conn.createStatement();
for (TaskInfo taskInfo : taskInfoList) {
Project project = projectService.getById(taskInfo.getProjectId());
List<SysTable> tableList = sysTableService.list(new QueryWrapper<SysTable>().eq("table_name", project.getTableName()));
//生成要执行的sql
String insertSql = genInsertSql(tableList, project.getTableName());
log.info("要执行的sql为:" + insertSql);
if (!TableUtil.executeDdlSql(insertSql)) {
log.info(project.getTableName() + "插入数据错误");
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
TableUtil.closeSource(null, stat, conn);
}
log.info("*********填充数据定时任务执行结束*********");
}
数据库表记录如下:
发现问题以后赶紧在本地运行项目,debug找原因,发现本地一切正常。然后就在脑海里回忆,项目最初部署好以后定时任务是正常运行的,并且只运行一次,是从什么时候开始运行了两次呢,突然想到客户有天提了个需求:
客户的域名是baidu.com(这里只是举例子,并不是真实的),想要通过www.baidu.com和baidu.com都可以访问到项目,于是去网上百度找解决办法,发现在tomcat下的server.xml文件中多配置一个host就行了,于是出现了如下配置:
<Host name="baidu.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
<Host name="www.baidu.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
配置完成以后,使用baidu.com也可以访问项目,使用www.baidu.com也可以访问到项目,乐呵呵的告诉客户问题解决了。
随后查看数据库记录数据出现重复开始的日期,对了下和客户聊天的日期,竟然是从这个时候开始重复的,于是去网上查了下,配置多个域名访问同一个项目可以使用别名配置,具体配置如下:
<Host name="baidu.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Alias>www.baidu.com</Alias>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
通过修改如下配置以后,定时任务就恢复正常了,不会在重复执行了。至于为什么会出现这个问题,还不是很清楚,看了网上的一些说法跟我碰到的都不太一样,有待补充。