避免Hangfire作业重复的提示?

5

我遇到了一个问题,有些使用相同参数的hangfire作业被队列排队多次,这些工作几乎在同一时间被排队。

我尝试将工作程序数限制为仅一个,然后用DisableConcurrentExecution装饰我的方法。

我正在使用sqlserver作为存储。是否有人遇到过这个问题,并且有一些避免它的提示?

PS:我使用了DisableConcurrentExecution,因为hangfire文档上说互斥体和信号量不能保证只调用一次作业。

PS2:检查我的hangfire服务器,我注意到我有两个实例,每个实例都有1个工作者,所以我认为这是一个并行问题而不是并发问题。

2个回答

3

感谢您的帮助@iliass!这不是一个RecurringJob,而是基于我从第三方应用程序接收到的Webhook事件启动的作业。 - aucls
1
@aucls。我想表达的意思是,你需要为你的工作分配唯一的ID。你这样做了吗? - Iliass Nassibane

3
这个解决方法对我很有效。我使用了MaximumConcurrentExecutions(1)来修饰hangfire运行的接口方法。
但由于有多个服务器(自动扩展),这并不能单独解决我的问题。
因此,在启动类中,我创建了另一个backgroundjobserveroptions来为此作业创建一个独占服务器,以确保当应用程序扩展时,不会创建另一个具有另一个队列的服务器。我必须在sqlserver hangfire.server中查询并检查我的队列是否已经存在。
if(!HangfireServerInfo.QueueExists("queuename", AppSettings.GetConnectionString("Hangfire"))){
        var hangfireServerOptions = new BackgroundJobServerOptions { WorkerCount = 1, Queues = new[] {"queuename"} };
        app.UseHangfireServer(hangfireServerOptions);
    }


public static class HangfireServerInfo
    {
        public static bool QueueExists(string queueName, string connectionString)
        {
            using (var connection = new SqlConnection(connectionString))
            {
                var cmd = connection.CreateCommand();
                cmd.CommandText = 
                    $@"SELECT COUNT(*) 
                    FROM {YOURHANGFIRESERVER.server}
                    WHERE JSON_QUERY(data, '$.queues') = '[""{queueName}""]'";

                connection.Open();
                var result = (int)cmd.ExecuteScalar();
                connection.Close();

                return result > 0;
            }
        }
    }

可能有更好的解决方法,但这个方法也可以。


你能不能贴出整个代码?你从哪里得到了checkIfQueueExists函数? - Dgan
@Ganesh_Devlekar编辑答案,抱歉没有放上所有的代码。如我所说,可能有更好的解决这个问题的方法,但对我来说这样做可以起作用。 - aucls

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接