spring定时任务执行两次的直接解决方案

本文介绍了一个针对无权限修改Tomcat配置的开发者如何处理@Scheduled定时任务被重复执行的问题。通过在代码中使用AtomicLong记录当前日期,确保只有一个线程执行任务,避免了任务重复。详细代码示例给出了解决方案。
摘要由CSDN通过智能技术生成

这个问题,很多人是通过修改tomcat的配置文件来解决的。这里之所以要提出一种直接解决方案,是应为并不是每个开发人员都有权限修改线上环境的tomcat配置,这个直接解决方案就是给无权修改tomcat配置的人或者想以直观的方式解决该问题的人准备的。

问题:通过@Scheduled配置定时任务,发现每到执行时间点,任务都会被执行两次。

解决思路:使用System.out.println(Thread.currentThread())打印出线程信息,发现每次都是两个不同线程再调用该任务。那么最直接的方法就是只让一个线程执行成功。

解决方案:通过原子类 AtomicLong 记录当前日期,如果当前日期没有被设置过,说明当前没有调用过改方法,如果设置过,则说明都不做。

代码:

@Component
@EnableScheduling
public class ScheduledJobs {
    static AtomicLong atomicInteger = new AtomicLong();
    @Autowired
    SubscribeAndBindCardService subscribeAndBindCardService;

    /**
     * 每天凌晨1点统计前一天粉丝数据
     */
    @Scheduled(cron = "0 0 1 * * ?")
    private void makeSubscribeAndBindCardData() {

        // 这里的atomicInteger 是为了解决 该定时任务每次调用都执行两次的问题。
        long currentDate = LocalDate.now().toEpochDay();
        if (atomicInteger.getAndSet(currentDate) != currentDate) {
            System.out.println(Thread.currentThread());
            System.out.println("LocalDate.now() = " + LocalDate.now());
            try {
                // 统计前一天的数据
                LocalDate statDate = LocalDate.now().minusDays(1);
                subscribeAndBindCardService.makeData(statDate, statDate);
            } catch (Exception exception) {
                exception.printStackTrace();
            }
        }


    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值