在服务总线队列触发的函数中排队另一个消息时,QueueClient.Complete(Guid)似乎不起作用

时间:2019-04-02 18:20:09

标签: azure azure-servicebus-queues

在Azure WebJobs的OnMessageOptions类中,我通过将QueueClient.Complete(Guid)标志设置为 true 来调用AutoComplete方法,消息似乎出队了。在运行ProcessQueue函数时很好。成功处理每条消息后,活动消息的计数将减少1。但是,当我想将一条消息(因为当前无法处理)重新排队以触发服务总线功能的队列时,在一分钟后使用BrokeredMessage.ScheduledEnqueueTimeUtc作为新的代理消息,似乎不是。工作。预定的邮件数最初似乎有所增加。几个小时后,我回到队列,看到成千上万的活动消息。副本具有相同的消息。怎么了?我希望由于QueueClient.Complete(Guid)消息将从队列中移出,新的预定消息将被替换。

一些详细信息:

要发送消息,请执行以下操作:

var queueclient = QueueClient.CreateFromConnectionString(connectionString, queueName);
queueclient.Send(message);
queueclient.close();

在WebJob内,我创建了一个ServiceBusConfiguration对象,该对象需要一个onMessageOptions对象,我在其中设置了AutoComplete=true。我将ServiceBusConfiguration对象传递给JobHostConfiguration.UserServiceBus 方法。

在WebJob服务总线队列触发的函数中,我再次通过重新创建代理消息的新实例来再次执行以下操作。

//如果尚不可用,请重新排队...

var queueclient = QueueClient.CreateFromConnectionString(connectionString, queueName);
    queueclient.Send(message);
    queueclient.close();

执行以下操作/使用回调,这可能就是为什么它不起作用的原因?

var options = new OnMessageOptions();
options.AutoComplete = false;  // to call complete ourselves

回调以处理收到的消息

client.OnMessage(m =>
{

    var clone = m.Clone();
    clone.ScheduledEnqueueTimeUtc = DateTime.UtcNow.AddSeconds(60);
    client.Send(clone);


    m.Complete();

}, options);

1 个答案:

答案 0 :(得分:2)

  

当我想使用BrokeredMessage.ScheduledEnqueueTimeUtc将消息(由于当前无法处理)重新排队到触发服务总线功能的队列时,在一分钟后作为新的代理消息,似乎不是工作

如果您无法处理您的消息,请不要重新排队。而是放弃(with a reason),它将再次被拾取。

BrokeredMessage.ScheduledEnqueueTimeUtc旨在用于添加到队列中的消息。收到消息后,您可以完成,死信,推迟或放弃。如果您放弃一条消息,它将被重试,但是您无法控制何时发生。如果队列中没有其他消息,它将立即重试。

注意:当您发现怀疑的行为不正确时,进行简单的复制即可非常有帮助。