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:
- 运行
EWQA
一切正常。
- 运行
EWPROD
和脚本(Hangfire 组件)似乎 运行 混合了 QA 和 PROD。
当我运行将它设置为 EWPROD
中的 'second time' 我已经确认:
hangfireCs
(连接字符串)是对的(指向PROD),赋值给JobStorage.Current
- 脚本末尾的查询,
JobStorage.Current.GetConnection().GetRecurringJobs()
使用了正确的连接。
createOrReplaceJob
Action 中的 RecurringJob.*
方法使用来自 previous 运行(即 EWQA
)的连接。如果我监控我的 QA Hangfire 数据库,我会看到删除和添加的作业。
临时解决方法:
- 运行
EWQA
一切正常。
- 重启LINQPad或使用'Cancel and Reset All Queries'方法
- 运行
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;
你的脚本。
我在 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:
- 运行
EWQA
一切正常。 - 运行
EWPROD
和脚本(Hangfire 组件)似乎 运行 混合了 QA 和 PROD。
当我运行将它设置为 EWPROD
中的 'second time' 我已经确认:
hangfireCs
(连接字符串)是对的(指向PROD),赋值给JobStorage.Current
- 脚本末尾的查询,
JobStorage.Current.GetConnection().GetRecurringJobs()
使用了正确的连接。 createOrReplaceJob
Action 中的RecurringJob.*
方法使用来自 previous 运行(即EWQA
)的连接。如果我监控我的 QA Hangfire 数据库,我会看到删除和添加的作业。
临时解决方法:
- 运行
EWQA
一切正常。 - 重启LINQPad或使用'Cancel and Reset All Queries'方法
- 运行
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;
你的脚本。