问题标签 [quartz.net]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1042 浏览

windows - Quartz.NET:如果在计划成熟时运行作业,则需要 iStatefulJob 实例上的 CronTrigger 来*延迟而不是跳过*

问候,您友好的社区 Quartz.NET n00b 回来了!

我有一个 Windows 服务在基于 Quartz.NET CronTrigger 的调度方案上运行 iStatefulJob 实例...用于调度作业的 CRON 字符串:“0 0/1 * * * ? *”

一切都很好。但是,如果我有一个作业设置为在每分钟的 X:00 标记处运行,并且该作业恰好运行超过一分钟,我注意到后续作业在作业完成后立即运行执行,而不是等到下一次计划运行,有效地“排队”而不是仅仅跳过作业直到下一次计划运行。

我在触发器中放入了一个 CronTrigger MisfireInstruction 的 DONOTHING 指令,但是当作业超出其下一个预定的执行计划时,也会发生完全相同的事情。

如何让 iStatefulJob 实例仅在它当前正在运行时跳过计划的执行触发器,而不是让它延迟到第一次执行完成?

我明确设置了 trigger.MisfireInstruction = MisfireInstruction.CronTrigger.DoNothing;

...但是,对于计划每分钟运行一次需要 90 秒才能完成的作业,我没有“什么都不做”,而是遇到以下执行日志:

  • 作业在上午 9:00:00 运行,在上午 9:01:30 结束 <- 作业运行时间为 1:30
  • 作业在上午 9:01:30 运行,在上午 9:03:00 完成 <- 应该在 9:01:00 运行的后续作业
  • 作业在上午 9:04:00 运行,在上午 9:05:30 完成 <- 这不应该在 9:03:00 运行吗?
  • 作业在上午 9:05:30 运行,在上午 9:07:00 完成 <- 应该在 9:05:00 运行的后续作业
  • 作业在上午 9:08:00 运行,在上午 9:09:30 完成 <- 这不应该在 9:07:00 运行吗?

...似乎它第一次正确运行,在一分钟...随着 90 秒的作业执行时间到期,延迟 30 秒,然后,而不是等到下一个完整的分钟,而是在 30 秒立即执行标记...奇怪的是,它然后在分钟标记上完成了第二个作业,但是等到下一个分钟标记执行而不是向后运行它 2-back...

当它没有在 :30 标记上运行时,它似乎在每次运行时都能正常工作......

获得一份工作的最佳方法不是延迟/排队,而是跳过直到它空闲并且下一个时间表成熟?

编辑:我尝试使用相同的 DONOTHING 触发失火指令返回 iJobs 而不是 iStatefulJobs,但是尽管先前的执行仍然处于活动状态,但该作业每分钟执行一次。如果它当前正在使用 iJob 或 iStatefulJob 运行,我似乎无法让它跳过预定的运行......

编辑#2:我认为我的触发器永远不会失火,这就是为什么 DoNothing 作为失火指令是无用的......鉴于这种情况,我想我需要另一种机制来检测调度的作业实例是否正在运行以确保该作业跳过其下一次执行,直到其下一个预定时间,而不是将其延迟到第一个实例完成......

EDIT3:我尝试向 iStatefulJob jobdatamap 添加一个名为“IsRunning”的元素......我在执行序列开始时将其设置为 TRUE,然后在作业完成后将其返回为 false。在执行之前,它会检查显然在作业之间持久存在的元素,如果它检测到它是真的,则过早地退出执行(记录“JOB SKIPPED!”)......不幸的是,这不起作用,原因可能很明显:如果作业按照上面列出的时间表运行,那么作业永远不会同时运行,因为它会延迟运行直到作业结束,所以这个检查是没有用的。根据文档,从 iStatefulJob 返回到 iJob 在这里无济于事,因为 jobdatamap 仅在 Stateful 作业类型的作业之间持续存在......

我还没有解决如何跳过计划的工作而不是将其延迟到当前迭代完成......如果有人有想法,你就是救星!:)

0 投票
1 回答
271 浏览

c# - 如果 Quartz 在运行时自行排队,则会删除作业

我对 Quartz 有以下问题:

作业计划每 10 分钟运行一次。有时(很少)这项工作可能需要超过 10 分钟。在这种情况下,Quartz 会将相同的作业放入队列中,以便在当前作业(相同作业)执行后运行。通常没问题;这项工作将连续运行两次,一切正常。但是,在某些情况下,第二次作业也需要 10 分钟以上。我希望 Quartz 会再一次将其放入队列中。相反,该作业永远不会排队,也不会再次运行。除此作业外,其他一切正常,直到系统重新启动后才再次运行。

这是预期的行为吗?有什么方法可以修改它以更好地满足我的需求?

0 投票
3 回答
1087 浏览

quartz.net - 如何在 Quartz.Net 作业中创建对实例化对象的引用?

我有一个带有嵌入式 Quartz.Net 的 Windows 服务,但似乎找不到在 Quartz.Net 作业中创建对实例化对象的引用的方法......

当 Windows 服务启动时,它会实例化一些用于日志记录、数据库访问和其他目的的对象,因此我希望我的 Quartz.Net 作业使用这些已经实例化的对象,而不是创建自己的这些对象的实例。但是,Quartz.Net 作业是由调度程序使用无参数构造函数实例化的,因此无法使用构造函数传递引用。

我是否必须创建自己的 JobFactory 实现,这是实现这一目标的唯一方法吗?

0 投票
1 回答
390 浏览

triggers - Quartz.NET 触发状态 - 哪些状态需要管理员注意?

我在我正在创建的应用程序中使用 Quartz.NET,还有一个备份应用程序,它将检测 Quartz 何时“无法正常工作”——这可能是调度程序关闭,或者在这种情况下,在特定状态下触发他们永远不会被处决。

但是,我需要检查哪些州?即,哪些州需要管理员注意?

0 投票
3 回答
5422 浏览

c# - Quartz.NET 远程处理 - 调度程序已经存在

我正在创建一个使用 Quartz.NET 的应用程序,该应用程序在 Windows 服务中使用。还有一个用 ASP.NET 编写的管理后端,管理员可以在其中添加作业并监视调度程序的状态。但是,我遇到了 ASP.NET 后端的问题。

连接是在 Global.asax 文件中建立的,起初它似乎工作 - 当用户登录到主仪表板时,它工作正常。问题是当用户点击另一个页面时,它会说调度程序“schedService”已经存在。

这是我的 Windows 服务代码:

ASP.NET Global.asax 代码:

然后我在每个 ASP.NET 页面中使用它:

0 投票
1 回答
1365 浏览

quartz.net - Quartz.Net ZeroSizeThreadPool 高 CPU 使用率

出于某种原因,当我如下配置和启动 ZeroSizeThreadPool Quartz.net 调度程序时,CPU 使用率非常高,导致计算机无响应......有谁知道为什么会发生这种情况以及如何解决问题?TIA。

0 投票
2 回答
35241 浏览

cron - 每天 12 小时执行 cron 触发器的 Cron 表达式?

我需要一个 cron 表达式 (0 0/60 * * * ?) 每 12 小时(每天两次)触发应用程序。

0 投票
1 回答
222 浏览

c# - 避免石英表错过

我正在使用quartz.net,它很棒。但是如果我的服务器关闭并且我错过了一个事件(我正在使用数据库存储石英事件)会发生什么?我想确保事件运行,即使它们晚了一周,但我看不出这是如何配置的?

0 投票
1 回答
1017 浏览

.net - Quartz .Net 架构问题

这是场景。我有一个应用程序可以出于多种原因与服务器保持持续连接。我需要从网络服务器获取或发布三组通用对象。

  1. 业务数据对象。这本质上是从服务器下拉到客户端机器并存储在本地数据库中的数据。如果用户更新其本地计算机上的数据,它会被标记并需要发送到服务器以与服务器同步。大约有 6 个自定义类需要下拉数据并将数据发送到服务器(在需要时)。

  2. 文件。正如它所说,这种同步是针对文件的。文件可以上传到服务器。但更重要的是,文件可以下载到客户端。将有从服务器自动发送的文件和其他需要的文件。

  3. 连接/登录查询。这些同步将从服务器中提取用户信息,并定期检查更新信息并验证权限。还需要检查以确保应用程序已连接到服务器,如果连接丢失,则适当处理。

我对 Quartz 很陌生,并且正在尝试考虑设置我希望发生的这 3 个不同同步的最佳方法。我有几个问题。

  1. 如果我想要多个线程池,我是否只想创建 3 个单独的调度程序工厂?我将如何通过配置完成此操作,或者我是否需要对其进行编码以在每次工厂实例化之前显式设置 Quartz 属性?

  2. 业务数据对象同步有时会是最重的负载。当用户首次登录或被分配额外权限时,他们可能需要从服务器下载多达 10K 的对象/记录。这将是一种罕见的情况,理想情况下,用户会连接,数据将全部下载,5-10 分钟后他们可以使用该应用程序来达到他们的目的。这种同步需要不断地检查服务器以查看它们是否是新数据并监视本地数据以查看是否需要将新数据发送到服务器。让工厂用它自己的线程池(比如 10 个线程)来处理所有这些是否有意义?

最终,我只是想弄清楚如何最初计划整个过程并将事情分开以轻松管理并正确执行。这是一个概念证明,任何帮助将不胜感激。请随时批评上述任何内容。

谢谢!

0 投票
3 回答
12845 浏览

quartz.net - 如何获得执行工作的名称?

在我的应用程序中,我有一个静态类(单例),需要使用一些在我的层中使用的环境变量进行初始化,我将其称为我的 applicationContext。这反过来又具有客户和用户上下文。

随着每个作业的运行,它会根据情况修改这些客户和用户上下文。我遇到的问题是,当两个作业同时触发时,它们可能会覆盖彼此的上下文,因此我需要为每个正在运行的作业保持多个用户和客户上下文处于活动状态,并且我需要能够以某种方式选择正确的上下文能够看到目前的工作是什么。

是否有可能以某种方式获取有关当前正在执行的quartz.net 作业的信息?

我正在设想这样的事情,其中​​“currentQuartzJob.Name”是由我所缺少的部分组成的:

}

编辑:

我认为不可能做我想做的事,即能够在一个不了解 Quartz.Net 的类中获取正在执行的作业的名称。

我真正需要的是一种为每项工作保留不同背景的方法。我设法通过查看执行线程的 ID 来做到这一点,因为它们似乎对于每个正在运行的作业都不同。