在 Quartz.Net 中调度相关作业

2023-11-27

我需要一些帮助。我正在尝试弄清楚如何在 Quartz.Net 中安排工作。 Quartz 中的作业对应于我的 Web 应用程序中的任务,它们都是我的 Web 应用程序中作业的一部分。我希望用户能够按需启动作业(Web应用程序上下文)并使其立即运行或安排将来的作业,并且可能在给定的时间间隔内重复。我知道所有这些项目是如何在 Quartz 中单独完成的,但我很难将它们放在一起。

例如,在我的 Web 应用程序中,我可能有一项包含多个任务的工作,并且按特定顺序进行。我希望能够在quartz中安排这些任务,以便它们按照我的Web应用程序中确定的相同顺序执行。有人知道如何做到这一点吗?我读过 Quartz 文档,说要将下一个作业存储在 JobDataMap 中,只是在努力解决这个问题。

我目前正在等待创建 Quartz 作业,直到用户请求安排作业或运行它。您认为我应该创建作业并在 Web 应用程序中创建任务时触发,然后从任务对象中提取该信息以在 Quartz 中进行调度吗?


你需要的是JobChainingJobListener类,它可以帮助您按照您想要的特定顺序为您的作业创建执行链。

using System;
using System.Text;
using Quartz;
using Quartz.Impl;
using Quartz.Impl.Calendar;
using Quartz.Listener;
using Quartz.Impl.Matchers;
using System.Threading;

namespace QuartzNET.Samples
{
    class Program
    {
        static void Main(string[] args)
        {
            // Create RAMJobStore instance
            DirectSchedulerFactory.Instance.CreateVolatileScheduler(5);
            ISchedulerFactory factory = DirectSchedulerFactory.Instance;

            // Get scheduler and add object
            IScheduler scheduler = factory.GetScheduler();          

            StringBuilder history = new StringBuilder("Runtime History: ");
            scheduler.Context.Add("History", history);

            JobKey firstJobKey = JobKey.Create("FirstJob", "Pipeline");
            JobKey secondJobKey = JobKey.Create("SecondJob", "Pipeline");
            JobKey thirdJobKey = JobKey.Create("ThirdJob", "Pipeline"); 

            // Create job and trigger
            IJobDetail firstJob = JobBuilder.Create<FirstJob>()
                                       .WithIdentity(firstJobKey)
                                       //.StoreDurably(true)
                                       .Build();

            IJobDetail secondJob = JobBuilder.Create<SecondJob>()
                                       .WithIdentity(secondJobKey)                                       
                                       .StoreDurably(true)                                       
                                       .Build();

            IJobDetail thirdJob = JobBuilder.Create<ThirdJob>() 
                                       .WithIdentity(thirdJobKey)
                                       .StoreDurably(true)
                                       .Build();

            ITrigger firstJobTrigger = TriggerBuilder.Create()
                                             .WithIdentity("Trigger", "Pipeline")
                                             .WithSimpleSchedule(x => x
                                                 .WithMisfireHandlingInstructionFireNow()
                                                .WithIntervalInSeconds(5)    
                                                .RepeatForever())
                                             .Build();

            JobChainingJobListener listener = new JobChainingJobListener("Pipeline Chain");
            listener.AddJobChainLink(firstJobKey, secondJobKey);
            listener.AddJobChainLink(secondJobKey, thirdJobKey);            

            scheduler.ListenerManager.AddJobListener(listener, GroupMatcher<JobKey>.GroupEquals("Pipeline"));

            // Run it all in chain
            scheduler.Start();
            scheduler.ScheduleJob(firstJob, firstJobTrigger);
            scheduler.AddJob(secondJob, false, true);
            scheduler.AddJob(thirdJob, false, true);

            Console.ReadLine();
            scheduler.Shutdown();
            Console.WriteLine("Scheduler shutdown.");
            Console.WriteLine(history);
            Console.ReadLine();
        }
    }

    class FirstJob : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            var history = context.Scheduler.Context["History"] as StringBuilder;
            history.AppendLine();
            history.AppendFormat("First {0}", DateTime.Now);            
            Console.WriteLine("First {0}", DateTime.Now);
        }
    }

    class SecondJob : IJob 
    {
        public void Execute(IJobExecutionContext context)
        {
            var history = context.Scheduler.Context["History"] as StringBuilder;
            history.AppendLine();
            history.AppendFormat("Second {0}", DateTime.Now);
            Console.WriteLine("Second {0}", DateTime.Now);            
        }
    }

    class ThirdJob : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            var history = context.Scheduler.Context["History"] as StringBuilder;
            history.AppendLine();
            history.AppendFormat("Third {0}", DateTime.Now);
            Console.WriteLine("Third {0}", DateTime.Now);
            Console.WriteLine();
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Quartz.Net 中调度相关作业 的相关文章

随机推荐

  • 如何对使用 Angular 中的路由器的组件进行单元测试?

    在 Angular 2 0 0 中 我正在对使用 Router 的组件进行单元测试 但是我得到 提供的参数与调用目标的任何签名都不匹配 错误 在spec ts的Visual Studio代码中 新的Router 以红色突出显示 正确的语法是
  • 选择optgroup中的所有选项

    我有一个select已分组的元素options 我需要选择 或取消选择 全部options in an optgroup当option被点击 我还需要能够拥有多个optgroup立即被选择 我希望它的工作方式是这样的 如果未选择任何内容 我
  • 在 Container-VM 映像上使用 root 用户登录 docker

    这是关于 Google Container VM Image beta 的问题https cloud google com compute docs containers vm image 我登录了一个由Container VM镜像制作的实
  • 输入大小固定的算法复杂度

    我找到了一些关于大 O 表示法的参考资料 但据我所知 算法复杂性是输入数据大小的函数 例如 如果冒泡排序的复杂度为O n 2 n是输入数组的大小 正确的 但是 如何确定具有固定输入大小并取决于输入值的算法的复杂性 例如 求最大公约数 GCD
  • bookdown:自定义输出文件名

    这是我之前在这里提出的问题的后续 为 bookdown 项目创建随附幻灯片 Bookdown允许将文件编译为各种格式 包括多个pdf 因此 问题是给输出赋予不同的名称 如果没有 则第二个pdf编译覆盖第一个 在对我之前问题的评论中 我写道
  • Wakanda 服务器脚本化干净关闭

    通过 OS X shell 脚本执行 Wakanda 服务器彻底关闭的最佳实践是什么 这将是当前加载和运行的解决方案 即将发布的 1 1 0 版本的最佳实践 处理applicationWillStop事件在service处理应用程序特定的关
  • .NET:如何在不打开文件的情况下打印文件

    我们有一个主要用于归档文件的应用程序 并且我们为用户提供了打印这些文件的可能性 它们可以是 txt doc pdf jpg 没什么花哨的 有没有一种 NET 方法可以将这些文件发送到打印机而不需要进一步处理它们 即打开它们 我已经尝试使用
  • 带 SFTP 的 Paramiko SSH 客户端

    如何进行 SFTP 传输SSHClient在远程服务器上 我有一个本地主机和两个远程主机 远程主机是备份服务器和Web服务器 我需要在备份服务器上找到必要的备份文件 并通过 SFTP 将其放在 Web 服务器上 如何使 Paramiko 的
  • 如何在 Flutter 中获取、设置、更新和删除 Cloud Firestore 中的数据?

    我尝试了一些代码 但出现异常 我得到的异常 java lang IllegalArgumentException Invalid document reference Document references must have an eve
  • 如何避免 HTML5 Canvas 中的多边形边缘缝合伪影?

    我为 OpenHeatMap 开源项目维护并行 Flash 和 HTML5 Canvas 渲染器 我受到两个版本之间带有分数坐标的填充多边形渲染不一致的困扰 如果渲染共享一条边的两个多边形 Canvas 将沿该边显示可见的连接 而 Flas
  • ViewExpiredException:找不到已保存的视图状态:在 JSF 中提交表单时

    我在尝试提交表单时遇到以下异常 javax faces application ViewExpiredException page1 xhtml No saved view state could be found for the view
  • 在Ubuntu上的QT5中将透明的QWidget放在QMediaView之上

    Goal 我希望基于 QT5 的 GUI 的背景是正在播放的视频文件 我还希望能够以透明度设置 GUI 组件的样式 以便视频能够透过它们显示 我不确定这是否有可能实现 可能是我刚刚错过了一个重要的线索 我毕竟是 Qt 初学者 也可能是它根本
  • Node.js读取USB端口信号

    我已经安装了串行端口使用 npm 的 Node js 模块 npm install serialport 现在我想通过计算机的 USB 端口从 Android 手机向节点应用程序发送一些消息 假设节点可以读取串行端口信号 以前有人这样做过吗
  • 如何在WinDbg中设置符号?

    我在用Windows 调试工具启动 WinDbg cdb 或 ntsd 时收到以下错误消息 Symbol search path is Invalid Symbol loading may be unreliable without a s
  • 使用 Google Apps 脚本获取工作表单元格注释值

    有没有办法获取单元格注释的值并将其显示在旁边的单元格中 我有一个 C 列 其中一些单元格包含注释 我想获取这些注释值并将每个单元格注释写入 D 列中其旁边的单元格中 例如 如果单元格 C4 有注释 无条目 我想在 D4 中显示 无条目 我今
  • PostgreSQL 转义 JSON 字符串

    我正在尝试使用 PostgreSQL 9 3 中的新 JSON 功能 并且正在寻找一个未转义 JSON 的函数 与 to json anyelement 相反 下面是一个 JSON 示例 single comment Fred said H
  • R 统计:简单列向量的问题

    我在使用从制表符分隔的数据文件导入的数据时遇到问题read delim 大多数列都包含我需要执行的数字数据t test为了 不幸的是我总是收到这个错误 Error in if stderr lt 10 Machine double eps
  • 通过readinto()将二进制数据解析为ctypes结构对象

    我正在尝试处理二进制格式 按照此处的示例 http dabeaz blogspot jp 2009 08 python binary io handling html gt gt gt from ctypes import gt gt gt
  • 在关闭警告中访问 foreach 变量

    我收到以下警告 访问闭包中的 foreach 变量 使用不同版本的编译器编译时可能有不同的行为 这就是我的编辑器中的样子 我知道如何解决此警告 但我想知道为什么会收到此警告 这是关于 CLR 版本吗 与 IL 有关吗 此警告有两个部分 第一
  • 在 Quartz.Net 中调度相关作业

    我需要一些帮助 我正在尝试弄清楚如何在 Quartz Net 中安排工作 Quartz 中的作业对应于我的 Web 应用程序中的任务 它们都是我的 Web 应用程序中作业的一部分 我希望用户能够按需启动作业 Web应用程序上下文 并使其立即