在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);
答案 0 :(得分:2)
当我想使用BrokeredMessage.ScheduledEnqueueTimeUtc将消息(由于当前无法处理)重新排队到触发服务总线功能的队列时,在一分钟后作为新的代理消息,似乎不是工作
如果您无法处理您的消息,请不要重新排队。而是放弃(with a reason),它将再次被拾取。
BrokeredMessage.ScheduledEnqueueTimeUtc
旨在用于添加到队列中的消息。收到消息后,您可以完成,死信,推迟或放弃。如果您放弃一条消息,它将被重试,但是您无法控制何时发生。如果队列中没有其他消息,它将立即重试。
注意:当您发现怀疑的行为不正确时,进行简单的复制即可非常有帮助。