我有一个quartz.net客户端/服务器设置,可以使用其他第三方库按计划发送一些短信。
Quartz.Server.exe在我的登台和开发环境中作为Windows服务运行,指向SQL上的作业,我的网站使用Quartz.Simpl.ZeroSizeThreadPool并只计划作业。一切都很好,直到它没有。
显然有些东西导致exe停止运行,即使它作为Windows服务运行,恢复选项设置为在发送电子邮件时向我发送电子邮件,但我没有收到电子邮件。
因此,当我重新启动服务器时,15天的短信发出了误导性的短语,例如"约会明天@9:00"约会5天前。
所以现在我已经更新了我的IJob代码,以便如果开火时间在预约时间之后,工作将被丢弃。由于我使用的是DateTime而不是普通字符串,因此我更改了#34; quartz.jobStore.useProperties = false"。当我准备好部署时,我意识到这种变化以及其他一些变化可能会破坏调度程序,以便它不会在更改之前触发历史触发器。
我钻了12个多小时的黑洞试图与设置搏斗,让我的新工作与我在当地和我的临时环境中的旧工作一起开火。尝试了一百万件事,包括作为服务的Quartz运行或指向SQL本地或登台的控制台的每个组合。说便盆话。然后说了一些祈祷。
重新开始。测试以查看实时服务器上的工作代码是否会在未经测试的情况下触发新旧作业。它不会。我改变了" quartz.jobStore.useProperties = false"在quartz.config中。有效!所以我在星期一晚上做了一个新的部署改变,一切似乎工作正常。我做了一个"保持我的工作跳舞",并重新访问我的错误记录/恢复设置,并在SQL中创建了一个夜间工作,以计算昨天,今天和明天每天早上的触发次数。
这是星期三早上,我检查我设置的SQL作业,发现昨天有150多个触发器尚未处理(一切都在美国东部时间早上9点)。所以我去我的实时服务器,Quartz服务仍在运行。我停止进程并转到我所在的文件夹,然后右键单击>以管理员身份运行。 Here is the error I get in my log.txt file。当然,现在Windows服务无法启动。
我需要快速帮助! I need a montage,在蒙太奇结束时,我需要成为一名quartz.net忍者。 Marko Lahma(或任何人)你会握住我的手"并告诉我,我将能够继续工作?我需要我的设置是防弹的(更强大/更失败更明显)。
编辑 - 201404241938Z
这是我的代码,用于检查打破旧作业的新值
// I think this next line is causing an error
DateTimeOffset oDateReminder = data.GetDateTimeOffset("reminderTime");
if (oDateReminder.DateTime > DateTime.MinValue)
{
// Do stuff with other "new job" datamap keys
…
// Changing it to…
if (data["reminderTime"] != null)
{
// Do stuff with other "new job" datamap keys
…
编辑 - 201404242205Z
这似乎有效。我等待并奖励一些赏金
答案 0 :(得分:2)
您可能知道,数据现在在包含JobDataMaps(二进制)和NameValueCollections(二进制)的DB中已损坏。
您想向最新的存储库主人发送一下吗?我已经知道了从这种混合数据情况中恢复的支持。只需使用最新版本并使用自定义snk文件构建并删除DLL以便运行。
这是版本2.2.x所以如果您使用的是2.1或2.0,请注意。
此处跟踪问题https://github.com/quartznet/quartznet/issues/172
原始问题是什么,一个简单的解决办法就是忽略失火,如果短信通知在预期时间内没有发出,那么它可能应该被忽略,并且在可能的情况下不会立即解雇。记录信息可能有助于您获取有关导致原始停机时间的信息(Windows更新,SQL服务器尚未启动等)。