stevenjin 2024-10-12 20:26 采纳率: 98%
浏览 2
已结题

JobChainingJobListener中定义多个可延时执行的触发器

1.以下方式定义按顺序执行的job可以很好的执行。
2.在下述三个Job中,都用触发器并指定StartAt可以吗?因为每个job都要有延时执行时间。


 private void FeedingOrderedPlanSchedule2()
 {
     // Get scheduler and add object
     IScheduler scheduler = MySchedulerFactory.GetScheduler();

     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<FeedingJob.OuterJob>()
     .WithIdentity(firstJobKey)
     .UsingJobData("jobSays", "Hello World!")
     //.StoreDurably(true)
     .Build();

     IJobDetail secondJob = JobBuilder.Create<FeedingJob.InnnerJob>()
     .WithIdentity(secondJobKey)
     .StoreDurably(true)//指示Quartz在Job成为“孤儿”时不要删除Job(当Job不再有Trigger引用它时),按顺序触发关键
     .Build();

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

     ITrigger firstJobTrigger = TriggerBuilder.Create()
     .WithIdentity("Trigger", "Pipeline")
     .WithSimpleSchedule(x => x
     .WithMisfireHandlingInstructionFireNow()
     .WithIntervalInSeconds(15)
     .WithRepeatCount(3)).StartAt(DateBuilder.FutureDate(1, IntervalUnit.Second))
     .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();

 }
  • 写回答

1条回答 默认 最新

  • 香格里辣 2024-10-12 20:59
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    在这个代码中,您已经在 JobChainingJobListener 中定义了多个按顺序执行的 job,并且通过触发器来设置每个 job 的执行时间。但是您想要每个 job 都具有可延时的触发器,这意味着每个 job 的执行时间都可以独立设置。在 Quartz 中,这是完全可能的。您可以为每个 job 创建不同的触发器,并设置不同的开始时间和间隔。下面是一个示例代码片段,展示了如何为每个 job 设置不同的触发器:

    private void ConfigureMultipleDelayedJobs()
    {
        IScheduler scheduler = MySchedulerFactory.GetScheduler();
        JobKey firstJobKey = JobKey.Create("FirstJob", "Pipeline");
        JobKey secondJobKey = JobKey.Create("SecondJob", "Pipeline");
        JobKey thirdJobKey = JobKey.Create("ThirdJob", "Pipeline");
    
        // 创建并配置第一个 job 和其触发器
        IJobDetail firstJob = JobBuilder.Create<FeedingJob.OuterJob>()
            .WithIdentity(firstJobKey)
            // 其他配置...
            .Build();
        ITrigger firstJobTrigger = TriggerBuilder.Create()
            .WithIdentity("FirstJobTrigger", "Pipeline")
            .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Second)) // 设置第一个 job 的开始时间
            .WithSimpleSchedule(builder => builder.WithIntervalInSeconds(30)) // 设置第一次之后的间隔和重复次数等细节
            .Build();
    
        // 创建并配置第二个和第三个 job 和其触发器,设置不同的开始时间和间隔等参数...
        IJobDetail secondJob = // 配置 secondJob 细节... Build();
        ITrigger secondJobTrigger = // 配置 secondJobTrigger 细节... Build();
        IJobDetail thirdJob = // 配置 thirdJob 细节... Build();
        ITrigger thirdJobTrigger = // 配置 thirdJobTrigger 细节... Build();
    
        // 设置 job 链监听器(如果已经设置了的话)以及将 job 添加到调度器(如果已经添加了的话)... 省略这部分代码以保持简洁性。请根据实际需求进行调整。
        // 注意:这里并没有实际添加监听器和调度任务代码,需要根据您的需求补充完整。不过监听器的使用与上面提供的代码相似。对于每个job和它的触发器设置独立的开始时间和调度参数是关键。一旦您设置了这些触发器并调度了相关的任务,Quartz 就会根据这些配置自动处理任务调度和触发机制。如果您要基于上一个任务的成功完成来触发下一个任务,您应该正确地使用JobChainingJobListener以确保正确的执行顺序和逻辑行为。这是非常重要的一点。此外,请注意Quartz中任务之间的依赖关系(比如链式作业)应当被仔细管理以确保不会出现逻辑错误或竞态条件等问题。如果前一个任务失败了而没有被正确恢复,可能会导致后续任务没有被正确触发和执行等问题。因此在实际应用中,确保任务间的依赖关系得到妥善处理是非常重要的。希望这些信息对您有所帮助!如果有任何进一步的问题或需要更详细的解释,请随时向我询问!
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月22日
  • 已采纳回答 10月14日
  • 修改了问题 10月12日
  • 创建了问题 10月12日

悬赏问题

  • ¥60 Matlab联合CRUISE仿真编译dll文件报错
  • ¥15 脱敏项目合作,ner需求合作
  • ¥15 脱敏项目合作,ner需求合作
  • ¥30 Matlab打开默认名称带有/的光谱数据
  • ¥50 easyExcel模板 动态单元格合并列
  • ¥15 res.rows如何取值使用
  • ¥15 在odoo17开发环境中,怎么实现库存管理系统,或独立模块设计与AGV小车对接?开发方面应如何设计和开发?请详细解释MES或WMS在与AGV小车对接时需完成的设计和开发
  • ¥15 CSP算法实现EEG特征提取,哪一步错了?
  • ¥15 游戏盾如何溯源服务器真实ip?需要30个字。后面的字是凑数的
  • ¥15 vue3前端取消收藏的不会引用collectId