当前位置: 首页 > 知识库问答 >
问题:

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

魏澄邈
2023-07-20

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

共有5个答案

徐卓
2023-07-20

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

柴瀚昂
2023-07-20

首先,需要创建一个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();        }    }}
左丘成仁
2023-07-20

xxl-job这个开源项目能满足你的需求https://www.xuxueli.com/xxl-job/#google_vignette

汪思博
2023-07-20

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

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

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

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

汤英豪
2023-07-20
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和中间件,到达路由映射表,在路由中一条一条进行匹配 视图函数根据