使用Hangfire和Azure Service Bus在1分钟后重试作业

时间:2016-10-06 13:18:29

标签: azure azureservicebus hangfire

我正在使用由SQL Server支持的Hangfire和Azure Service Bus

我的Hangfire服务器配置如下所示:

var hangfireServiceBusQueuePrefix = ConfigurationManager.AppSettings["HangfireServiceBusQueuePrefix"];
var azureServiceBusConnectionString = ConfigurationManager.ConnectionStrings["AzureServiceBus"].ConnectionString;

var serviceBusQueueOptions = new ServiceBusQueueOptions
{
    ConnectionString = azureServiceBusConnectionString,

    Queues = new[] { EnqueuedState.DefaultQueue },

    QueuePrefix = (hangfireServiceBusQueuePrefix.Equals("MachineName")
        ? Environment.MachineName
        : hangfireServiceBusQueuePrefix)
        + "-hangfire-"
};

var storage = new SqlServerStorage("Hangfire")
    .UseServiceBusQueues(serviceBusQueueOptions);

_hangfireConfiguration = GlobalConfiguration.Configuration
    .UseStorage(storage);

我注意到,如果我的工作在1分钟后没有完成,那么它就会被重播 - 即使原来的工作还在运行......

例如,当我排队这样的工作时:

BackgroundJob.Enqueue(MyMethod);

如果我们想象MyMethod看起来像这样

public void MyMethod()
{
    Console.WriteLine("MyMethod Started");
    Thread.Sleep(TimeSpan.FromSeconds(90));
    Console.WriteLine("MyMethod Finished");
}

...会发生什么,1分钟后,该方法将'重启' 30秒后,第一个实例将完成,然后第二个实例将在60秒后完成。

我需要完成这项工作,而不会在一分钟后重新尝试

1 个答案:

答案 0 :(得分:1)

当您收到消息时,消息会被锁定一段时间。这是为了避免另一个接收者得到相同的消息。

您可以在创建队列时配置LockDuration。 来自文档:

  

LockDuration的最大值为5分钟;默认值为1分钟。

如果您需要锁定邮件超过5分钟,可以使用RenewLock方法手动增加锁定。