作业完成完整执行后调用函数

2024-01-19

我们正在使用 Quartz.Net 在 Windows 服务中按计划触发作业。

我有一种情况,我必须每次触发一个工作5 minutes from Start DateTime till End DateTime.

工作完成后我们需要计算Next Start DateTime and Next End DateTime并保存到数据库 -

为此我尝试覆盖JobListener其中有一个方法:JobWasExecuted

public class xPTJobListener : JobListenerSupport
{
    public override string Name { get { return "xPTJobListener"; } }

    public override void JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException)
    {

        var dataMap = context.MergedJobDataMap;
        var schedule = (MyDTO)dataMap["Schedule"];

        using (var logger = new xPTLogger())
        {
            logger.LogMessage(MessageType.Information, string.Format("Inside JobWasExecuted() - [{0}] - ", schedule.Id));
        }

        base.JobWasExecuted(context, jobException);
    }
}

还有TriggerComplete in the TriggerListener

public class xPTTriggerListener : TriggerListenerSupport
{
    public override string Name { get { return "xPTTriggerListener"; } }

    public override void TriggerComplete(ITrigger trigger, IJobExecutionContext context, SchedulerInstruction triggerInstructionCode)
    {

        var dataMap = context.MergedJobDataMap;
        var schedule = (MyDTO)dataMap["Schedule"];

        using (var logger = new xPTLogger())
        {
            logger.LogMessage(MessageType.Information, string.Format("Inside Trigger Complete - [{0}] - ", schedule.Id));
        }


        base.TriggerComplete(trigger, context, triggerInstructionCode);

    }
}

但上述方法的问题在于,每次调用作业时,它们都会被执行。

所以如果我有一份工作从12:01 AM并结束12:02 AM每 5 秒 - 这两个方法都会被调用12 times

我需要的是在一个作业迭代结束后仅调用一次方法 - (在作业执行 12 次之后)?

我如何在石英中执行此操作?

EDIT

创建触发器

public static ITrigger GenerateTrigger(RouteMonitorScheduleDTO routeSchedule, double fGmtOffset, xPTLogger logger)
{
    ITrigger trigger = null;

    switch (routeSchedule.ScheduleInfo.PeriodType)
    {
        case PeriodTypeEnum.Once:
            trigger = TriggerBuilder.Create()
                        .WithIdentity(string.Format("trigger_{0}", routeSchedule.RouteScheduleId), DefaultGroup)
                        .StartAt(routeSchedule.DepartureDateTime)
                        .WithSimpleSchedule(s => s.WithIntervalInMinutes(5))
                        .EndAt(routeSchedule.ArrivalDateTime.AddMinutes(5))
                        .Build();
            break;
        case PeriodTypeEnum.Daily:
        case PeriodTypeEnum.WeekDays:
        case PeriodTypeEnum.Weekly:
        case PeriodTypeEnum.Monthly:
            var schedule = routeSchedule.ScheduleInfo;        
            var cronExpresion = xPTCronBuilder.GenerateCronExpression(
                                    schedule.PeriodType,                         
                                    schedule.ScheduleStringValue, 
                                    fGmtOffset,             
                                    routeSchedule.DepartureDateTime,
                                    routeSchedule.ArrivalDateTime.AddMinutes(5), 5);
            trigger = TriggerBuilder.Create()
                        .WithIdentity(string.Format("trigger_{0}", routeSchedule.RouteScheduleId), DefaultGroup)
                        .WithCronSchedule(cronExpresion)
                        .Build();
            break;
    }

    return trigger;
}

EDIT使用 Cron 触发:

trigger = TriggerBuilder.Create()
.WithIdentity(string.Format("trigger_{0}", 1), "Group1")
.WithCronSchedule("0 0-45/5 7-7 ? * TUE,WED *").Build();

正如您从上面的 cron 表达式中看到的,它将从以下位置运行7 AM to 7:45 AM every 5 minutes every Tuesday and Wednesday.

所以 1 次迭代是7AM to 7:45 AM on Tuesday,接下来是7 AM to 7:45 on Wednesday。我需要在每次迭代完成后调用一个函数。

所以假设当最后一个触发器被触发时7:45 AM on Tuesday- 我需要调用该函数。


如果我正确理解您的问题,您可以通过以下方式使用 ITriggerListener 执行此操作:

public class xPTTriggerListener : TriggerListenerSupport {
    public override string Name
    {
        get { return "xPTTriggerListener"; }
    }

    public override void TriggerComplete(ITrigger trigger, IJobExecutionContext context, SchedulerInstruction triggerInstructionCode) {
        if (triggerInstructionCode == SchedulerInstruction.DeleteTrigger) {
            // means this trigger won't be fired again - now recalculate your dates in database
        }
        base.TriggerComplete(trigger, context, triggerInstructionCode);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

作业完成完整执行后调用函数 的相关文章

随机推荐

  • 使 WCF 更易于配置

    我有一组通过桌面应用程序动态连接的 WCF Web 服务 我的问题是 WCF 需要非常详细的配置设置才能工作 让 SSL 发挥作用涉及自定义设置 让 MTOM 或其他任何东西正常工作需要更多 你想要压缩吗 又来了 WCF 确实很强大 您可以
  • 运行 React Native 应用程序时出现错误

    昨天 当我尝试运行该项目时 我遇到了以下错误表单 任务 app checkDEVDebugAarMetadata 执行失败 执行时发生故障 com android build gradle internal tasks CheckAarMe
  • ASP.NET MVC - 将数组对象作为 Html.ActionLink(...) 中的路由值传递

    我有一个返回数组 string 的方法 并且我尝试将此字符串数组传递到操作链接中 以便它将创建一个类似于以下内容的查询字符串 Controller Action str val1 str val2 str val3 etc 但是当我传递 n
  • 如何在 WPF 中的元素上添加半透明阴影?

    我想在 WPF 窗口的内容上添加半透明颜色 以指示窗口的状态 目前我正在使用填充窗口的用户控件 并根据需要更改背景颜色和可见性 此方法的问题是 当 UserControl 可见时 我无法单击 UserControl 后面的窗口中的任何控件
  • WebStorm (2018.2.3) 中 Jest (23.5.0) 中未解析的函数或方法“xxx”

    我最近在 Jest 23 5 0 和 WebStorm 2018 2 3 智能感知方面遇到了问题 对于所有 Jest 方法 例如toHaveBeenCalledWith toHaveLength 我收到一个Unresolved functi
  • SQLITE3增加最大列数

    我正在考虑使用 SQLite3 所以我开始了一些性能测试 因为我有一个包含许多列的表 所以我想增加 SQLite3 的最大列限制 正如我在 SQLite 网站上看到的 限制设置为 2000 列 现在我想增加它 我想使用 sqlite3 li
  • 使用camel从数据库读取并写入文件

    我想使用 Camel 从数据库读取记录并将记录写入文件 下面是我的代码 import javax sql DataSource import org apache camel CamelContext import org apache c
  • 是什么导致 JVM 进行主要的垃圾回收?

    我有一个 Java 应用程序 它在不同的环境中显示不同的 GC 行为 在一种环境中 仅当堆已满 gt 90 时 堆使用情况图才会呈缓慢锯齿状 每 10 小时左右就会发生一次主要 GC 在另一个环境中 JVM 每小时准时执行一次主要 GC 此
  • Grafana:如何获得选定时间段的持续时间

    I can t find the correct mathematical formula to compute a SLA availability with Grafana I have graph to show the durati
  • 如何合并 Spark 数据集中的行以合并字符串列

    我需要将数据集中的两行或更多行合并为一行 分组必须基于id柱子 要合并的列是一个字符串 我需要在合并列中获取逗号分隔的字符串 我如何在Java中实现这一点 输入行 col1 col2 1 abc 2 pqr 1 abc1 3 xyz 2 p
  • go中如何获取当前包的名称?

    有没有办法在运行时获取当前包的名称 package main import fmt func main pkgName some magic here fmt Println pkgName 结果应该是 main 现在我正在使用常量 例如
  • Eclipse 无法识别任何导入

    我似乎在 Eclipse 中搞砸了一些事情 它无法识别我尝试导入的任何库 以下是一些未被识别的事情 import java util ArrayList import android content Intent import com go
  • 匹配正则表达式并在单行代码中分配结果

    我希望能够对变量进行正则表达式匹配并将结果分配给变量本身 最好的方法是什么 我想将第 2 行和第 3 行合并到一行代码中 variable some string variable find something variable 1 有没有
  • 如何为 Swagger API 响应指定通用类型类

    我有大约 40 个 API 它们具有类似的基本响应结构 如下所示 lastAccessed 2015 30 08 14 21 45T createdOn 2015 30 07 09 04 10T lastModified 2015 30 0
  • Emscripten 的 CMake 项目

    我想与 CMake 和 Emscripten 成为朋友 在 Emscripten 项目网站上没有找到更多或更少的信息文档 但他们提供了 CMake 工具链文件 所以我认为这应该是可能的 到目前为止 没有高级参数的非常基本的编译工作正常 但我
  • 如何在一定数量的请求后停止 scrapy 蜘蛛?

    我正在开发一个简单的抓取工具来获取 9 个搞笑帖子及其图像 但由于一些技术困难 我无法停止刮刀 它会继续刮这是我不想要的 我想增加计数器值并在 100 个帖子后停止 但是 9gag 页面的设计方式是在每次响应中只提供 10 个帖子 每次迭代
  • Vulkan 验证层无法在 Linux 上加载/工作

    我有基本的 Vulkan 应用程序 Hello Triangle 源自本教程 https vulkan tutorial com 在调试模式下 我使用两个验证层 VK LAYER KHRONOS validation and VK LAYE
  • 将 Jar 文件添加到 WEB-INF/lib [重复]

    这个问题在这里已经有答案了 我是 Eclipse Java 和 Linux 的新手 我搜索这个问题 但没有找到答案 我想编写一个操作 HBase 表的程序 所以我有一些与 HBase 相关的 Jar 文件 在普通的 Java 应用程序中 我
  • PHP 和 MySQL 与 Highchart

    有人可以帮助我 我是 php 和 highcharts 的新手 我尝试使用 mysql 和 php 填充我的图表 但是当我尝试运行它时 图表没有出现 我只看到一个空白网页 并且没有出现错误 她是我的代码 抱歉代码混乱
  • 作业完成完整执行后调用函数

    我们正在使用 Quartz Net 在 Windows 服务中按计划触发作业 我有一种情况 我必须每次触发一个工作5 minutes from Start DateTime till End DateTime 工作完成后我们需要计算Next