怎么根据计划周期定时生成工单, 求解答?

怎么根据计划周期定时生成工单,当计划开始根据选择的周期,如立即执行一次,每天执行一次,每月执行一次。 最好可以指定每天几点,每月几号执行

阅读 2.7k
5 个回答
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Timer timer = new Timer();

        // 每天的特定时间(例如,每天的 14:30:00)执行任务
        Calendar dailyTime = Calendar.getInstance();
        dailyTime.set(Calendar.HOUR_OF_DAY, 14);
        dailyTime.set(Calendar.MINUTE, 30);
        dailyTime.set(Calendar.SECOND, 0);

        if (dailyTime.before(Calendar.getInstance())) {
            dailyTime.add(Calendar.DAY_OF_MONTH, 1);
        }

        timer.schedule(new MyTask(), dailyTime.getTime(), 24*60*60*1000);

        // 每月的特定日期(例如,每月的第 10 天)执行任务
        Calendar monthlyDate = Calendar.getInstance();
        monthlyDate.set(Calendar.DAY_OF_MONTH, 10);
        monthlyDate.set(Calendar.HOUR_OF_DAY, 14);
        monthlyDate.set(Calendar.MINUTE, 30);
        monthlyDate.set(Calendar.SECOND, 0);

        if (monthlyDate.before(Calendar.getInstance())) {
            monthlyDate.add(Calendar.MONTH, 1);
        }

        timer.schedule(new MyTask(), monthlyDate.getTime(), 30*24*60*60*1000);
    }

    static class MyTask extends TimerTask {
        public void run() {
            // 这里写你的任务
            System.out.println("Task executed.");
        }
    }
}
新手上路,请多包涵

直接上定时任务框架:Quartz、xxl-job、elastic-job

Quartz
优点:支持集群部署
缺点:没有自带的管理界面;调度逻辑和执行任务耦合在一起;维护需要重启服务
总结:针对目前项目情况,利弊相同

xxl-job
优点:支持集群部署;提供运维界面维护成本小;自带错误预警;相对elastic-job来说不需要额外的组件(zookeeper);支持调度策略;支持分片; 故障转移 ;更适合分布式
缺点:相对Quartz来说需要多部署调度中心
总结:针对目前项目情况,利大于弊

elastic-job
优点:支持集群部署;维护成本小
缺点:elastic-job需要zookeeper,zookeeper集群高可用至少需要三台服务器
总结:针对目前项目情况,弊大于利

新手上路,请多包涵

首先,需要创建一个Job类,这个类定义了要执行的任务

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class MyJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("执行任务!");
    }
}

接下来,需要创建一个Scheduler来调度任务:

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import java.time.*;

public class MyScheduler {
    public static void main(String[] args) {
        try {
            // 创建调度器
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            scheduler.start();

            // 定义任务
            JobDetail job = JobBuilder.newJob(MyJob.class)
                    .withIdentity("myJob", "group1")
                    .build();

            // 定义触发器
            // 立即执行,并每24小时执行一次
            Trigger trigger = TriggerBuilder.newTrigger()
                    .withIdentity("myTrigger", "group1")
                    .startNow()
                    .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                            .withIntervalInHours(24)
                            .repeatForever())
                    .build();

            // 定义特定时间触发器
            LocalTime time = LocalTime.of(15, 0); // 每天15点执行
            ZonedDateTime zonedDateTime = LocalDateTime.of(LocalDate.now(), time).atZone(ZoneId.systemDefault());
            Date startAtDate = Date.from(zonedDateTime.toInstant());

            Trigger triggerAtTime = TriggerBuilder.newTrigger()
                    .withIdentity("myTriggerAtTime", "group1")
                    .startAt(startAtDate)
                    .withSchedule(CronScheduleBuilder.dailyAtHourAndMinute(time.getHour(), time.getMinute()))
                    .build();

            // 将任务与触发器添加到调度器中
            scheduler.scheduleJob(job, trigger);
            scheduler.scheduleJob(job, triggerAtTime);

            // scheduler 关闭时,jobs 将自动从数据库中删除
            scheduler.shutdown(true);
        } catch (SchedulerException se) {
            se.printStackTrace();
        }
    }
}

ruoyi 使用的是 quartz。
保存计划的时候,根据周期更新定时任务的Cron 表达式,参数为工单id,选择立即执行。
image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题