怎么根据计划周期定时生成工单,当计划开始根据选择的周期,如立即执行一次,每天执行一次,每月执行一次。 最好可以指定每天几点,每月几号执行
ruoyi 使用的是 quartz。
保存计划的时候,根据周期更新定时任务的Cron 表达式,参数为工单id,选择立即执行。
首先,需要创建一个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(); } }}
xxl-job这个开源项目能满足你的需求https://www.xuxueli.com/xxl-job/#google_vignette
直接上定时任务框架:Quartz、xxl-job、elastic-job
Quartz
优点:支持集群部署
缺点:没有自带的管理界面;调度逻辑和执行任务耦合在一起;维护需要重启服务
总结:针对目前项目情况,利弊相同
xxl-job
优点:支持集群部署;提供运维界面维护成本小;自带错误预警;相对elastic-job来说不需要额外的组件(zookeeper);支持调度策略;支持分片; 故障转移 ;更适合分布式
缺点:相对Quartz来说需要多部署调度中心
总结:针对目前项目情况,利大于弊
elastic-job
优点:支持集群部署;维护成本小
缺点:elastic-job需要zookeeper,zookeeper集群高可用至少需要三台服务器
总结:针对目前项目情况,弊大于利
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."); } }}
问题内容: 我如何知道JavaScript的周数和年份来计算日期?对于第20周和2013年以获得5/16/2013,我正在尝试这样做: 问题答案: function getDateOfWeek(w, y) { var d = (1 + (w - 1) * 7); // 1st of January + 7 days for each week 这使用简单的周定义,即2013年的第20周是5月14日
问题内容: 给定“ 从日期” ,“ 到日期” 和“ 会计年度”系统 ,我想获得基于“会计年度”系统的给定“从”和“截止日期”内的所有拆分期限。下面用示例说明: 示例1: 会计年度系统:4月至3月 从日期:2008年1月5日到日期:2008年5月15日 根据会计年度系统,工期应分为: 示例2: 会计年度系统:4月至3月 从日期:2008年1月17日到日期:2009年5月20日 根据会计年度系统,工期
订单编号代表该单据在一个系统当中独一无二的存在,不可能会有第二个订单编号的存在,在平时购物的时候,吃饭的时候等都会生成对应的订单编号,吃饭的时候生成流水号,购物的时候生成订单编号和交易号,都会有相关的编码规则来实现。
就如泛型类型能够被限定一样,生命周期(它们本身就是泛型)也可以使用限定。: 字符的意义在这里稍微有些不同,不过 + 是相同的。注意下面是怎么说明的: T: 'a:在 T 中的所有引用都必须比生命周期 'a 活得更长。 T: Trait + 'a:T 类型必须实现 Trait trait,并且在 T 中的所有引用都必须比 'a 活得更长。 下面例子展示了上述语法的实际应用: use std::fmt
问题内容: 我在sql中有一个用户表,他们每个都有生日。我想将他们的出生日期转换为他们的年龄(仅年),例如日期:年龄:14,并将更改为年龄: 在这里,我想显示用户的日期: 问题答案: 功能:, MySQL > = 5.0.0 功能:,
本文向大家介绍Django form表单与请求的生命周期步骤详解,包括了Django form表单与请求的生命周期步骤详解的使用技巧和注意事项,需要的朋友参考一下 Django中请求的生命周期 HTTP请求及服务端响应中传输的所有数据都是字符串 步骤 用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务器 url经过wsgi和中间件,到达路由映射表,在路由中一条一条进行匹配 视图函数根据