【问题标题】:Manually triggering and waiting for Quartz.Net job手动触发并等待 Quartz.Net 作业
【发布时间】:2021-08-12 18:43:22
【问题描述】:

我们刚刚从 Quartz.Net 3.2.4 升级到 3.3.3,不幸的是,我们的一项集成测试失败了。我们正在尝试测试 Quartz 作业,测试的方式是通过 ServiceProvider 获取作业实例并调用 Execute()。

var deleteExpiredPendingFileCleanupTask = scope.ServiceProvider.GetService<DeleteExpiredPendingFileCleanupTask>();
var jobExecutionContext = new Mock<IJobExecutionContext>();

await deleteExpiredPendingFileCleanupTask.Execute(jobExecutionContext.Object);

不幸的是,Quartz.Net 似乎不再创建服务实例,GetService() 返回 null。我一直在寻找我想到的两种解决方案之一:

  • 有没有办法像以前一样创建作业实例(使用 DI 等)来执行
  • 有没有办法等待手动触发的作业并阻塞直到它完成

我不确定是否有我没有想到的第三种解决方案,但对于这两个,我希望有人可能有我错过的答案。我看到 this unanswered question 询问其中的第二个想法。

我找到的临时解决方案是在我们的集成测试启动中手动创建服务,但这并不理想,因为它与实际的生产配置不匹配。

services.AddScoped<DeleteExpiredPendingFileCleanupTask, DeleteExpiredPendingFileCleanupTask>();

谢谢。

【问题讨论】:

    标签: c# quartz.net quartz.net-3.0


    【解决方案1】:

    Quartz 更改了逻辑,它不再自动将作业注册到容器中,但如果手动注册,它会尝试解决它们,请参阅MicrosoftDependencyInjectionJobFactory。因此,您手动注册作业的方法是有效的,您也可以为您的生产配置执行此操作 - 只要它们的范围与您的配置显示的一样。

    没有等待手动触发作业的内置方法,如果您考虑一个可以在任何节点上运行作业的集群设置,这有点困难。如果您只希望在测试中使用此功能,您可以注册 ITriggerListenerIJobListener 并跟踪互斥量/信号量,然后您可以设置/监控并在作业和测试之间创建通信通道。

    【讨论】:

      猜你喜欢
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      • 2016-03-20
      • 2021-05-28
      • 1970-01-01
      相关资源
      最近更新 更多