我在 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 功能,但我不确定这是否会影响它。
但这是问题/流程:
- 运行它
EWQA
,一切正常。 - 运行它,
EWPROD
脚本(Hangfire 组件)似乎混合了 QA 和 PROD 运行。
当我“第二次”运行它时,EWPROD
我已经确认:
- (
hangfireCs
连接字符串)是正确的(指向 PROD),它被分配给JobStorage.Current
- 脚本末尾的查询
JobStorage.Current.GetConnection().GetRecurringJobs()
使用正确的连接。 - Action 中的
RecurringJob.*
方法createOrReplaceJob
使用上一次运行的连接(即EWQA
)。如果我监控我的 QA Hangfire 数据库,我会看到该作业被删除和添加。
临时解决方法:
- 运行它
EWQA
,一切正常。 - 重新启动 LINQPad 或使用“取消并重置所有查询”方法
- 运行它
EWPROD
,现在一切正常。
所以我不知道问题可能出在哪里。我觉得我升级/安装 LINQPad7 可能会导致问题,但我不确定是否有其他方法可以使RecurringJob.*
静态方法使用“更新”连接字符串。
关于为什么现在需要重新启动或重置的任何想法?
LINQPad - 5.44.02 Hangfire.Core - 1.7.17 Hangfire.SqlServer - 1.7.17