springboot定时任务重复执行

问题描述:程序中有一个定时任务,每半个小时执行一次,按照规则生成假数据插入到数据库中,突然有一天查看数据库,每次都会有两条数据,数据还不一样,意识到是不是定时任务重复执行了,就去看了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 &quot;%r&quot; %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 &quot;%r&quot; %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 &quot;%r&quot; %s %b" />
      </Host>

通过修改如下配置以后,定时任务就恢复正常了,不会在重复执行了。至于为什么会出现这个问题,还不是很清楚,看了网上的一些说法跟我碰到的都不太一样,有待补充。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值