从Azure服务总线队列读取消息,但不是实时读取

vnzz0bqm  于 2022-11-25  发布在  其他
关注(0)|答案(1)|浏览(118)

我有一个特定业务案例,其中我需要读取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
   };

有人能提供一点代码片段,让我读取队列但不是实时读取

htrmnn0y

htrmnn0y1#

您可以使用Timer Triggered Azure Function并安排它每天运行一次。在函数代码中,您可以使用Service Bus SDK从Service Bus读取消息并处理它们。

更新

我注意到您正在使用服务总线处理器来处理消息,它基本上提供了一个基于事件的模型来处理消息。
您可以直接使用ServiceBusReceiver并使用ReceiveMessagesAsync(Int32, Nullable<TimeSpan>, CancellationToken)手动读取消息,而不是使用它。

相关问题