0

我在 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变量并运行一次 forEWPROD和一次 for EWQA。直到最近这一切都很好,不幸的是我不知道它什么时候发生了变化,因为我并不总是必须在两种环境中运行。

两天前我确实购买/安装了 LINQPad 7 来查看一些 C# 10 功能,但我不确定这是否会影响它。

但这是问题/流程:

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

当我“第二次”运行它时,EWPROD我已经确认:

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

临时解决方法:

  1. 运行它EWQA,一切正常。
  2. 重新启动 LINQPad 或使用“取消并重置所有查询”方法
  3. 运行它EWPROD,现在一切正常。

所以我不知道问题可能出在哪里。我觉得我升级/安装 LINQPad7 可能会导致问题,但我不确定是否有其他方法可以使RecurringJob.*静态方法使用“更新”连接字符串。

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

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

4

1 回答 1

0

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

完成后清除/处置对象(例如,JobStorage.Current?)或通过添加Util.NewProcess=true;到脚本告诉 LINQPad 不要在执行之间重用进程。

于 2022-02-14T01:32:37.347 回答