这项工作对我有用。我用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;
}
}
}
可能这是解决它的更好方法,但这有效。