【问题标题】:Job retried after 1 minute using Hangfire with Azure Service Bus使用 Hangfire 和 Azure 服务总线在 1 分钟后重试作业
【发布时间】:2016-10-06 13:18:29
【问题描述】:

我正在使用由 SQL Server 支持的 Hangfire 和 Azure 服务总线

我的 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 秒后完成。

我需要完成这项工作,一分钟后不重试

【问题讨论】:

    标签: azure azureservicebus hangfire


    【解决方案1】:

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

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

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

    如果需要锁定消息超过5分钟,可以使用RenewLock方法手动增加锁定..

    【讨论】:

    • 小问题是我无法使用 Hangfire Azure 服务总线库访问 RenewLock 方法...我不认为?
    • 续订锁在 brokeredmessage 上。您有权访问代理消息吗?
    • 不,一切都结束了。我会看一下lib的源代码,看看是否有什么可以添加的
    猜你喜欢
    • 1970-01-01
    • 2020-03-04
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 2019-01-08
    • 2022-07-15
    相关资源
    最近更新 更多