.net-core - 从 BackgroundService 启动服务总线客户端
问题描述
我有一个ServiceBusClient
类,它创建一个QueueClient
用于在公共汽车上收听消息的类。我查看了以下文章来进行设置:
我的ServiceBusClient
类处理QueueClient
看起来像这样:
public class ServiceBusClient : IServiceBusClient
{
public ServiceBusClient(IEventService eventService, ServiceBusClientOptions options)
{
...
queueClient = new QueueClient(options.ConnectionString, options.QueueName);
}
public void Run()
{
RegisterOnMessageHandler();
}
private void RegisterOnMessageHandler()
{
...
queueClient.RegisterMessageHandler(ProcessMessagesAsync, messageHandlerOptions);
}
private async Task ProcessMessagesAsync(Message message, CancellationToken token)
{
var eventMessage = EventMessage.FromMessage(message);
await eventService.Write(eventMessage);
if (!token.IsCancellationRequested)
{
await queueClient.CompleteAsync(message.SystemProperties.LockToken);
}
}
private Task ExceptionReceivedHandler(ExceptionReceivedEventArgs exceptionReceivedEventArgs)
{
// log errors
...
return Task.CompletedTask;
}
}
我希望从一个IHostedService
甚至通过扩展BackgroundService
. 在我发现的示例中,工作不断在一个不适合我的场景的 while 循环中执行,因为我只尝试运行一个命令。
所以我创建了一个超级简单的实现,如下所示:
protected override async Task ExecuteAsync(CancellationToken cancellationToken)
{
serviceBusClient.Run();
while (!cancellationToken.IsCancellationRequested)
{
// empty loop to keep running for lifetime of pod
}
}
如果删除async
我显然需要返回一些东西。我试过Task.CompletedTask
了,但这需要我将返回类型更改为Task<Task>
.
如果我有适当的async
位置,我将需要await
一些东西,但我不确定是什么。
这感觉不对。ServiceBusClient
我认为我需要更改ProcessMessagesAsync
.
我想要的只是让我的网络应用程序开始监听消息,直到它死掉。我怎样才能做到这一点?
解决方案
我放弃了使用BackgroundService
并IHostedService
改为实施。
public class MessageListenerService : IHostedService
{
private readonly IServiceBusClient client;
private readonly ITelemetryClient applicationInsights;
public MessageListenerService(IServiceProvider serviceProvider)
{
client = serviceProvider.GetService<IServiceBusClient>();
applicationInsights = serviceProvider.GetService<ITelemetryClient>();
}
public Task StartAsync(CancellationToken cancellationToken)
{
applicationInsights.TrackTrace(new TraceTelemetry("MessageListenerService is starting"));
client.Run();
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
applicationInsights.TrackTrace(new TraceTelemetry("MessageListenerService is stopping"));
return client.Stop();
}
}
如果您发现此代码有问题,请在评论中告诉我,我会酌情更新。
最后我们还是为它创建了一个控制台应用程序。
推荐阅读
- shell - 使用映射文件更改列的名称
- javascript - 单击锚标记时,如何保存该元素 ID 以便以后使用?
- mysql - Sequelize 多连接中的排序错误
- gatling - 关于将动态模拟传递给负载测试设置
- reactjs - ReactJS 相邻的 JSX 元素必须包含在封闭标记中
- python - Dataframe .where() 方法返回 None
- c# - 使用 LINQ 对单个列表中的多个值进行分组和合并
- python - Raspberry Pi Tkinter Python 3.4.2 - 创建脚本以关闭 2 个或多个脚本
- android - Android Studio 3.6.1 的布局编辑器中缺少标记为“设计”和“文本”的选项卡
- python - 我如何从终端启动 youtube 全屏