根据数据库查询出时间,确定定时任务执行时间cron

Scheduling @Component这两个注解要记得加,我的@EnableScheduling加载启动类了,定时任务类就不用加了 

实现SchedulingConfigurer 类,重写configureTasks方法,里面有个添加触发器任务addTriggerTask,这个的源码

他就是需要一个Runnable启动一个线程,执行目标任务,一个Trigger触发器,设置定时时间。

因为cron的表达式是这样的:@Scheduled(cron = "0/1 * * * * ?")

所以要转换一下。因为spring-boot这个cron表示式没有年份,所以没有yyyy

Date->String(cron)

public class CronUtils {
    private static final SimpleDateFormat sdf = new SimpleDateFormat("ss mm HH dd MM ?");

    /***
     *  功能描述:日期转换cron表达式
     * @param date
     * @return
     */
    public static String getCron(Date date) {
        String formatTimeStr = null;
        if (Objects.nonNull(date)) {
            formatTimeStr = sdf.format(date);
        }
        return formatTimeStr;
    }
}
定时任务
    @Component
    class TestTask implements SchedulingConfigurer {

        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                // 定时任务要执行的内容
                System.out.println("【开始执行定时任务。。。bbbbbbbbb】");
            }
        };

        Trigger trigger = new Trigger() {
            @Override
            public Date nextExecutionTime(TriggerContext triggerContext) {
               // String cron = "0/1 * * * * ?"; //可以将表达式配置在数据库中
                String cron =  CronUtils.getCron(new Date(1607222391000l));
                System.out.println("cron:"+cron);
                return new CronTrigger(cron).nextExecutionTime(triggerContext);
            }
        };
        
        @Override
        public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
            taskRegistrar.addTriggerTask(runnable, trigger);
            }
    }

 结果:

【开始执行定时任务。。。bbbbbbbbb】
cron:51 39 10 06 12 ?
 

 

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,根据您的要求,我为您提供以下的Go代码,使用Cron调度器: ```go package main import ( "database/sql" "fmt" "time" "github.com/gocarina/gocsv" _ "github.com/go-sql-driver/mysql" "github.com/robfig/cron/v3" ) type Task struct { Name string `csv:"name"` Time string `csv:"time"` } func main() { db, err := sql.Open("mysql", "<username>:<password>@tcp(<host>:<port>)/<database>") if err != nil { panic(err.Error()) } defer db.Close() // 从数据中获取需要执行的任务 rows, err := db.Query("SELECT name, time FROM tasks WHERE is_enabled = 1") if err != nil { panic(err.Error()) } var tasks []Task for rows.Next() { var name string var time string err = rows.Scan(&name, &time) if err != nil { panic(err.Error()) } tasks = append(tasks, Task{Name: name, Time: time}) } // 根据任务的执行时间,计算每周几执行任务 c := cron.New() for _, task := range tasks { t, err := time.Parse("15:04", task.Time) if err != nil { panic(err.Error()) } weekday := int(t.Weekday()) if weekday == 0 { weekday = 7 } _, err = fmt.Printf("任务 %s 将在每周%d的%s执行\n", task.Name, weekday, task.Time) if err != nil { panic(err.Error()) } // 每周执行3次任务,生成csv文件 spec := fmt.Sprintf("0 %s * * %d", task.Time, weekday) _, err = c.AddFunc(spec, func() { for i := 0; i < 3; i++ { nextTime := t.AddDate(0, 0, (i*7)+(weekday-int(time.Now().Weekday())+7)%7) filename := fmt.Sprintf("%s-%d.csv", task.Name, i+1) records := []Task{task} err := gocsv.MarshalFile(&records, filename) if err != nil { panic(err.Error()) } _, err = fmt.Printf("已生成任务 %s 的第%d个csv文件:%s\n", task.Name, i+1, filename) if err != nil { panic(err.Error()) } } }) if err != nil { panic(err.Error()) } } c.Start() defer c.Stop() select {} } ``` 在这个代码中,我们使用了Cron调度器来执行任务。首先,我们连接到MySQL数据查询需要执行的任务。接着,我们根据每个任务的执行时间,计算每周几需要执行任务,并使用Cron调度器添加相应的定时任务。最后,我们使用`time`和`github.com/gocarina/gocsv`包生成csv文件并输任务执行结果。 希望这个代码能够满足您的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值