LINQPad 中的静态 Hangfire RecurringJob 方法不正常

Static Hangfire RecurringJob methods in LINQPad are not behaving

我在 LINQPad 中有一个如下所示的脚本:

var serverMode = EnvironmentType.EWPROD;
var jobToSchedule = JobType.ABC;
var hangfireCs = GetConnectionString(serverMode);
JobStorage.Current = new SqlServerStorage(hangfireCs);

Action<string, string, XElement> createOrReplaceJob =
    (jobName, cronExpression, inputPackage) =>
    {
        RecurringJob.RemoveIfExists(jobName);
        RecurringJob.AddOrUpdate(
            jobName,
             () => new BTR.Evolution.Hangfire.Schedulers.JobInvoker().Invoke(
                     jobName,
                     inputPackage,
                     null,
                     JobCancellationToken.Null),
            cronExpression, TimeZoneInfo.Local);
    };

// psuedo code to prepare inputPackage for client ABC...

createOrReplaceJob("ABC.CustomReport.SurveyResults", "0 2 * * *", inputPackage);

JobStorage.Current.GetConnection().GetRecurringJobs().Where( j => j.Id.StartsWith( jobToSchedule.ToString() ) ).Dump( "Scheduled Jobs" );

我必须同时安排 QA 和 PROD。为此,我将 serverMode 变量和 运行 切换一次用于 EWPROD,一次用于 EWQA。直到最近,这一切都运行良好,不幸的是,我不确切知道它是什么时候发生变化的,因为我并不总是需要在两种环境中 运行。

两天前我做了 purchase/install LINQPad 7 来查看 C# 10 的一些功能,我不确定这是否影响了它。

但这里是 problem/flow:

  1. 运行 EWQA 一切正常。
  2. 运行 EWPROD 和脚本(Hangfire 组件)似乎 运行 混合了 QA 和 PROD。

当我运行将它设置为 EWPROD 中的 'second time' 我已经确认:

  1. hangfireCs(连接字符串)是对的(指向PROD),赋值给JobStorage.Current
  2. 脚本末尾的查询,JobStorage.Current.GetConnection().GetRecurringJobs()使用了正确的连接。
  3. createOrReplaceJob Action 中的 RecurringJob.* 方法使用来自 previous 运行(即 EWQA)的连接。如果我监控我的 QA Hangfire 数据库,我会看到删除和添加的作业。

临时解决方法:

  1. 运行 EWQA 一切正常。
  2. 重启LINQPad或使用'Cancel and Reset All Queries'方法
  3. 运行 EWPROD 现在一切正常。

所以我不知道问题出在哪里。我觉得我的 LINQPad7 upgrade/install 可能会导致问题,但我不确定是否有其他方法可以使 RecurringJob.* 静态方法使用 'updated' 连接字符串。

关于为什么现在需要重新启动或重置的任何想法?

LINQPad - 5.44.02 Hangfire.Core - 1.7.17 Hangfire.SqlServer - 1.7.17

这是由于您的脚本(或您调用的库)静态缓存某些内容,而不是在执行之间进行清理造成的。

当你完成时 clear/dispose 对象(例如,JobStorage.Current?)或者告诉 LINQPad 不要 re-use 执行之间的过程,通过添加 Util.NewProcess=true;你的脚本。