我有一个ASP.NET核心应用程序,并且想要使用Hangfire来执行一些后台任务。我按照官方文件中的描述设置了Hangfire,我可以称之为通常的背景任务。但是,我在延迟调用这些方法时遇到了问题。
public void Configure(/*other params*/ IBackgroundJobClient backgroundJobsClient)
{
//Other code
backgroundJobsClient.Enqueue(() => Console.WriteLine("Method"));
backgroundJobsClient.Schedule(() => Console.WriteLine("Delayed Method"), TimeSpan.FromSeconds(2));
}我在控制台中只有“方法”输出。
在等待了一分钟之后,我的控制台中有一个异常:
由于异常,Hangfire.PostgreSql.PostgreSqlDistributedLockException:执行DelayedJobScheduler现在处于失败状态,重试次数将不会超过00:00:04,Hangfire.Processing.BackgroundExecution无法对资源‘HangFire:DelayedJobScheduler:schedulepoller’:锁定超时进行锁定。在Hangfire.PostgreSql.PostgreSqlDistributedLock.PostgreSqlDistributedLock_Init_Transaction(String资源,在Hangfire.PostgreSql.PostgreSqlDistributedLock..ctor(String资源的TimeSpan超时值,IDbConnection连接,PostgreSqlStorageOptions选项),TimeSpan超时,IDbConnection连接,PostgreSqlStorageOptions选项)在Hangfire.PostgreSql.PostgreSqlConnection.AcquireDistributedLock(String资源,TimeSpan超时值( Hangfire.Server.DelayedJobScheduler.UseConnectionDistributedLockT at Hangfire.Server.DelayedJobScheduler.EnqueueNextScheduledJobs(BackgroundProcessContext上下文)在Hangfire.Server.DelayedJobScheduler.Execute(BackgroundProcessContext上下文)( Hangfire.Server.BackgroundProcessDispatcherBuilder.ExecuteProcess(Guid executionId,Object state)在Hangfire.Processing.BackgroundExecution.Run(Action`2回调,Object state)!无法锁定资源‘HangFire: lock :schedulepoller’:锁定超时。
因此,我想延迟的方法初始化有一些问题。有人能帮我吗?可能我没有为ASP.NET核心正确地设置Hangfire。
发布于 2020-07-22 16:03:28
我终于找到了解决办法。日期以UTC格式存储在Hangfire数据库中。我不知道,官方的文档也没有对此发表任何意见。正确的代码应该如下所示:
DateTime.UtcNow.AddSeconds(2);发布于 2021-12-20 07:27:04
我解决了这个问题如下。
在Hangfire table中有lock table。我删除了锁表中的所有数据,我的问题解决了。
https://stackoverflow.com/questions/63030430
复制相似问题