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

javascript - Quartz如何根据cron表达式计算任务开始前发送通知的时间?

储臻
2024-06-19

任务调度

任务的执行时间是cron表达式,使用quartz定时器生成任务
现在需要在每次任务开始前一定时间(例:1天、一周、15分钟)发送通知

在不改前端的情况下。有什么好的做法实现吗。

计算通知的cron,有点过于复杂,也没有找到工具可以使用

共有3个答案

戚哲
2024-06-19

那就再写一个quartz定时任务,表达式设为之前的任务的前15/1天/1周...执行就可以了
现在AI助手很多,你直接让它们提供你需要时间的cron表达式就行了

沈冠宇
2024-06-19

bing搜索的 https://www.matools.com/cron/

陆翰藻
2024-06-19

在Quartz中实现任务开始前发送通知的功能,通常的做法不是通过计算另一个Cron表达式来确定通知的时间,而是利用Quartz提供的触发器监听器(TriggerListener)或者任务监听器(JobListener)来实现。这些监听器允许你在触发器触发前或任务执行前执行自定义逻辑。

下面是一个简单的例子,展示了如何使用触发器监听器在任务开始前发送通知:

import org.quartz.*;import org.quartz.impl.matchers.GroupMatcher;public class NotificationTriggerListener implements TriggerListener {    @Override    public String getName() {        return "NotificationTriggerListener";    }    @Override    public void triggerFired(Trigger.TriggeredBundle bundle) {        // 当触发器触发时,执行此方法        JobExecutionContext context = bundle.getJobExecutionContext();        JobDetail jobDetail = context.getJobDetail();        Trigger trigger = bundle.getTrigger();                // 这里发送通知的逻辑        sendNotification(jobDetail, trigger);    }    @Override    public boolean isTriggerComplete(Trigger.CompletedExecutionInstruction triggerInstructionCode) {        return true;    }    @Override    public void triggerMisfired(Trigger.TriggeredBundle bundle) {        // 当触发器误触发时执行    }    @Override    public void triggerComplete(Trigger.CompletedExecutionInstruction triggerInstructionCode, JobExecutionContext context, CompletedExecutionException exception) {        // 触发器完成时执行    }    private void sendNotification(JobDetail jobDetail, Trigger trigger) {        // 这里编写发送通知的代码,例如发送邮件、消息队列等        // 你可以根据jobDetail和trigger的信息来决定通知的内容        // 例如,可以获取触发器下次的执行时间,并提前一定时间发送通知    }    // 其他方法可以留空或返回默认值}// 在Quartz Scheduler初始化时注册监听器SchedulerFactory schedulerFactory = new StdSchedulerFactory();Scheduler scheduler = schedulerFactory.getScheduler();scheduler.getListenerManager().addTriggerListener(new NotificationTriggerListener());

在上面的代码中,NotificationTriggerListener 类实现了 TriggerListener 接口,并重写了 triggerFired 方法。当触发器触发时,该方法会被调用,你可以在这个方法中编写发送通知的逻辑。你可以从 JobExecutionContext 对象中获取 JobDetailTrigger 的信息,然后根据这些信息来决定通知的内容。

注意,这里的 sendNotification 方法是一个占位符,你需要根据实际需求来实现发送通知的逻辑。例如,你可以使用邮件服务、消息队列或其他通信机制来发送通知。

另外,如果你想在任务开始前的一定时间发送通知,你可以在 sendNotification 方法中计算触发器下次的执行时间,然后提前相应的时间发送通知。这可以通过获取触发器的 getNextFireTime() 方法来实现。

最后,记得在Quartz Scheduler初始化时注册你的监听器,这样它才能正常工作。

这种方法不需要计算另一个Cron表达式,而是利用了Quartz的事件监听机制,使得代码更加清晰和可维护。

 类似资料:
  • null 上个月的第一天和本月的第一天 上月1日和本月第3个工作日 当前星期的星期一日期和当前星期的staturday日期。

  • 我正在使用石英调度程序来安排我的工作。我有一个错误的cron表达式: 当我这样做的时候: is。但是当我查看表达式时,它显然是错误的。其他人也面临类似的问题吗? 注:包装为:包装组织。石英 石英的版本是:2.2.3 请检查来自的CronExpression类http://www.javadoc.io/doc/org.quartz-scheduler/quartz/2.2.3 我还尝试了类的方法,但

  • 我需要开发一个web服务,这将帮助客户机做一些周期性的工作,api将喜欢这个void Dojob(int jobType,string cronExpression);

  • 我想调度多个任务使用@调度注释使用cron表达式。我有三项工作需要在固定时间执行。例如,作业-1被安排在每天晚上11点,作业-2被安排在每天早上7点到晚上9点,间隔1小时,作业-3被安排在每1小时。所有3个计划任务都是同一应用程序的一部分。 我也尝试过同样的方法,但所有三个调度都没有发生。我的应用程序是SpringBoot应用程序。我不是新的调度。请帮帮我。下面是他我的方法 application

  • 是否有可能有一个(石英)调度程序与cron表达式,触发后每5天,包括今天的日期。对于例如。如果我在2016年12月14日安排一个工作,间隔5天,那么它应该在12月14日,12月19日,12月24日,12月29日,1月3日,1月8日,1月13日,1月18日,1月23日,1月28日,2月2日等触发...?我试了“17 33 15 14/5*?*”,但没有给出准确的结果。好心帮忙!!!

  • 我的路线计划每月在凌晨1:00运行一次,如果我的应用程序在这段时间内关闭,就会出现问题,所以我想在应用程序启动时运行该作业。 它使用时间段(如果服务重新启动,作业将运行),但不使用cron表达式。 我试过使用以下方法,但没有成功。 从(“quartz2://scheduler?cron=0 45 15 1 1/1?”? 有人能让我知道,如果我错过了什么。

  • 我在创建计时器点击00:00时发送通知的方法时遇到一些问题。 我的意思是,我希望当计时器结束时,如果应用程序关闭,它会发送一个通知事件。 我已经找到了一种方法来显示通知,并使计时器即使在应用程序关闭时也能工作。 但当我把功能发送通知在计时器的末尾它只工作时,应用程序打开。 这是我的主要活动。JAVA AppJava类 AndroidManifest。xml 谢谢你的帮助! 祝你有愉快的一天 克里斯

  • 问题内容: 我使用Spring应用程序上下文来处理Java Web应用程序。在这种情况下,我使用Quartz定义了计划作业。这些作业由.properties文件中定义的cron触发。 Spring上下文嵌入战争中,而.properties文件位于应用程序服务器(在这种情况下为Tomcat)上。 这很好,并允许根据环境(开发,集成,生产等)定义不同的克朗。 现在,在我自己的计算机上本地运行此应用程序