定时执行任务

定时执行任务

用于定时执行某个模块

1:创建定时任务类,使用cron表达式调整定时时间

import com.atguigu.staservice.service.StatisticsDailyService;
import com.atguigu.staservice.utils.DateUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class ScheduledTask {

    
    //这个是所需修改的数据表对应的service,用以控制其
    @Autowired
    private StatisticsDailyService staService;

    // 0/5 * * * * ?表示每隔5秒执行一次这个方法
    @Scheduled(cron = "0/5 * * * * ?")
    public void task1() {
        System.out.println("**************task1执行了..");
    }

    //在每天凌晨1点,把前一天数据进行数据查询添加
    //给serviceImpl中传入一个day参数,并让其每天凌晨一点执行
    //DateUtil.formatDate(DateUtil.addDays(new Date(), -1))是获取到前一天的日期
    //staService.registerCount是serviceimpl中的方法
    @Scheduled(cron = "0 0 1 * * ?")
    public void task2() {
        staService.registerCount(DateUtil.formatDate(DateUtil.addDays(new Date(), -1)));
    }
}

serviceimpl中需要使用这个的方法

这里面并不用给出时间,时间由创建定时那块获取到昨天的时间传进去,让凌晨一点执行

  //统计某一天注册人数,生成统计数据
    @Override
    public void registerCount(String day) {

        //添加记录之前删除表相同日期的数据
        QueryWrapper<Daily> wrapper=new QueryWrapper<>();
        wrapper.eq("date_calculated",day);
        baseMapper.delete(wrapper);

        //远程调用,查询出今日注册的人数
        R r = ucenterClient.countRegister(day);
        Integer integer=(Integer) r.getData().get("countRegister");

        //将获取到的数据添加到数据分析表
        //把获取数据添加数据库,统计分析表里面
        Daily sta = new Daily();
        sta.setRegisterNum(integer); //注册人数
        sta.setDateCalculated(day);//统计日期

        sta.setVideoViewNum(RandomUtils.nextInt(100,200));
        sta.setLoginNum(RandomUtils.nextInt(100,200));
        sta.setCourseNum(RandomUtils.nextInt(100,200));
        baseMapper.insert(sta);

    }

2:在启动类上添加注解

@EnableScheduling    //定时执行
public class StaApplication {

3:在线生成cron表达式

http://cron.qqe2.com/

4:创建Util获取时间

两个方法分别是:获取到当前日期和 amount 后天的日期,amount可以为负数

public class DateUtil {

    private static final String dateFormat = "yyyy-MM-dd";

    /**
     * 格式化日期
     *
     * @param date
     * @return
     */
    public static String formatDate(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        return sdf.format(date);

    }

    /**
     * 在日期date上增加amount天 。
     *
     * @param date   处理的日期,非null
     * @param amount 要加的天数,可能为负数
     */
    public static Date addDays(Date date, int amount) {
        Calendar now =Calendar.getInstance();
        now.setTime(date);
        now.set(Calendar.DATE,now.get(Calendar.DATE)+amount);
        return now.getTime();
    }

    public static void main(String[] args) {
        System.out.println(DateUtil.formatDate(new Date()));
        System.out.println(DateUtil.formatDate(DateUtil.addDays(new Date(), -1)));
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java定时执行任务的方法有很多种,下面列举了一些常用的方法。 1. Timer 和 TimerTask 这是Java官方提供的定时器类,可以定时执行特定的任务。使用方法如下: ``` Timer timer = new Timer(); TimerTask task = new TimerTask() { public void run() { // 定时执行任务代码 } }; timer.schedule(task, delay); ``` 其中delay参数指定延迟多长时间执行任务(单位为毫秒)。如果想定时周期执行任务,可以使用scheduleAtFixedRate方法。 ``` timer.scheduleAtFixedRate(task, delay, period); ``` 其中period指定周期(单位为毫秒)。 2. ScheduledExecutorService 这是Java 5之后新增的任务调度类,也可以用于定时执行任务。使用方法如下: ``` ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); Runnable task = new Runnable() { public void run() { // 定时执行任务代码 } }; scheduler.scheduleAtFixedRate(task, delay, period, TimeUnit.MILLISECONDS); ``` 其中delay、period单位都是毫秒。 3. Spring Framework的TaskScheduler TaskScheduler是Spring Framework中的一个接口,可以方便地实现定时任务调度。使用方法如下: ``` @Autowired private TaskScheduler scheduler; public void scheduleTask() { scheduler.schedule(new Runnable() { public void run() { // 定时执行任务代码 } }, new CronTrigger(cronExpression)); } ``` 其中,cronExpression是一个时间表达式,可以自由配置定时任务执行时间。 无论选择哪种方法,定时执行任务都是一个非常常见的应用场景,需要在实际使用中进行灵活运用。 ### 回答2: Java 中的定时执行任务可以通过两种方式来实现:Timer 和 ScheduledExecutorService。 Timer 使用起来比较简单,它可以按照一定的时间间隔来执行任务或延迟一定时间后执行任务。创建 Timer 之后,可以使用 Timer.schedule() 方法来设置任务执行时间和周期。 ScheduledExecutorService 也可以用于定时执行任务,它比 Timer 更加灵活,支持更多的定时执行方式,如延迟执行、周期执行等。ScheduledExecutorService 使用起来也比较简单,可以通过 Executors.newScheduledThreadPool() 方法来创建 ScheduledExecutorService,然后使用 ScheduledExecutorService.schedule() 或 ScheduledExecutorService.scheduleAtFixedRate() 方法来设置任务执行时间和周期。 无论是使用 Timer 还是 ScheduledExecutorService,都需要实现一个任务类来处理具体的业务逻辑。任务类需要实现 Runnable 接口,并在任务类中实现它的 run() 方法。定时任务执行时,只需要将任务类作为参数传递给 Timer.schedule() 或 ScheduledExecutorService.schedule() 方法即可。 在实际应用中,需要根据具体的业务需求选择合适的定时执行方式。如果需要执行简单的定时任务,Timer 可能更加适合;如果需要执行复杂的定时任务,ScheduledExecutorService 可能更加灵活、可控。同时,在编写定时任务的代码时需要注意线程安全问题,尽量避免对共享数据的并发访问产生数据不一致的情况。 ### 回答3: Java定时执行任务是一种非常常见的应用场景,通常情况下为了实现定时任务的功能,可以使用 Java 语言中的 Timer、ScheduledExecutorService、Quartz 等工具对任务进行调度。 Java 的 Timer 类允许程序员在指定时间后启动单个线程任务,并且可定期重复执行,Timer 可以使用 TimerTask 类实现自己的任务。一个 Timer 只会启动一次,Timer 运行的任务如果抛出异常,整个 Timer 将会停止运行。 Java 的 ScheduledExecutorService 类是一个基于线程池的定时任务调度器,与 Timer 不同的是,ScheduledExecutorService 非常灵活、可扩展和安全可靠,推荐使用这种方式来实现定时任务功能。 另外,Quartz 是一个流行的开源框架,用于实现定时任务调度,重要特点是可以管理大量的微小作业,可以代表简单的任意的调度结构。Quartz 支持 Cron 表达式,可以在不同的时间和日期触发动作,动态改变触发周期,支持任务的并发执行,负载均衡和容错机制,达到了集中部署线上任务的高效管理。 总的来说,Java 定时执行任务的实现方式有多种,具体使用哪种方式取决于具体场景和需求,需要根据实际情况进行选择和使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值