我有一个特定业务案例,其中我需要读取Azure服务总线队列-但读取此队列不应该是实时的。
这是我的设置
- 我有一个Azure函数,它正在做一些事情,其中一部分处理是在一天结束时从服务总线队列中读取一些消息。
- 我有一个服务总线主题,它自动将消息转发到服务总线队列。这是实时完成的。因此,在7个小时的工作周期内,消息将堆积在此队列中(平均每天约20条消息)
- 在一天结束时,该函数将读取服务总线队列(非实时)中的消息(平均20条)并生成报告。
我在网上看到的所有代码片段都是实时触发的,因为它们都注册了一个事件,一旦有消息发送到队列,就会触发这个事件。
我在我的应用程序中有这段代码的简单片段,但是我注意到,一旦消息被添加到队列中,消息就会立即从队列中被拉出来,这是我不希望的。我希望消息一直保留在队列中直到一天结束
public async Task<IEnumerable<ChangeNotification>> ReadChangeNotificationMessagesAsync()
{
processor = client.CreateProcessor(serviceBusOptions.TopicName, serviceBusOptions.SubscriptionName, serviceBusProcessorOptions);
processor.ProcessMessageAsync += AddNotificationToQueueEventAsync;
processor.ProcessErrorAsync += ProcessErrorEventAsync;
await processor.StartProcessingAsync();
}
private async Task AddNotificationToQueueEventAsync(ProcessMessageEventArgs args)
{
var changeNotification = args.Message.Body.ToObjectFromJson<ChangeNotification>(
new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
//do some stuff
}
private Task ProcessErrorEventAsync(ProcessErrorEventArgs arg)
{
//log error
}
serviceBusProcessorOptions = new ServiceBusProcessorOptions
{
MaxConcurrentCalls = serviceBusOptions.Value.MaxConcurrentCalls,
AutoCompleteMessages = serviceBusOptions.Value.AutoCompleteMessages
};
有人能提供一点代码片段,让我读取队列但不是实时读取吗
1条答案
按热度按时间htrmnn0y1#
您可以使用
Timer Triggered Azure Function
并安排它每天运行一次。在函数代码中,您可以使用Service Bus SDK从Service Bus读取消息并处理它们。更新
我注意到您正在使用服务总线处理器来处理消息,它基本上提供了一个基于事件的模型来处理消息。
您可以直接使用
ServiceBusReceiver
并使用ReceiveMessagesAsync(Int32, Nullable<TimeSpan>, CancellationToken)
手动读取消息,而不是使用它。