我有一个Azure函数,在该函数运行时,我使用服务总线处理器从服务总线主题接收消息(请注意,这不是触发器)。根据从主题接收的消息,我正在设置CancellationToken。
我能够将所有与服务总线相关的代码移到一个单独的服务中,并将ServiceBusClient
注入Program.cs:-
builder.Services.AddAzureClients(clientBuilder =>
{
clientBuilder.AddServiceBusClientWithNamespace(serviceBusOptions.ServiceBusUri)
.WithCredential(new DefaultAzureCredential())
.ConfigureOptions(options =>
{
//
});
}
但我不确定是否也可以注入Service Bus Processor,或者是否可以将此逻辑移到服务中,基于docmentation,建议缓存。
当前代码(内部函数):-
processor = queueService.GetProcessor(subscriptionName);
processor.ProcessMessageAsync += async (ProcessSessionMessageEventArgs args) => {...}
processor.ProcessErrorAsync += Processor_ProcessErrorAsync;
await processor.StartProcessingAsync();
我想避免将这段代码保留在main函数类中,有没有什么方法可以注入它或者写得更好?
**编辑:**函数运行一些sql存储过程,有时过程可能需要时间,用户可能会请求取消。由于没有其他方法来停止正在运行的函数示例,我使用了此方法。请建议是否有更好的方法来停止正在运行的函数示例。
1条答案
按热度按时间qv7cva1a1#
正如有人已经在这里指出的那样,我对这种做法也有类似的感觉。
问题是在函数中运行
ServiceBusProcessor
。虽然技术上是可能的,但它不是为短期执行而设计的。ServiceBusProcessor
本身就是一个消息泵。Azure函数也是如此。也许基于函数的实现不是这种情况的方法。