gpt4 book ai didi

asp.net-core - 多个长时间运行的 IHostedServices 或 BackgroundService 实现

转载 作者:行者123 更新时间:2023-12-03 21:18:48 25 4
gpt4 key购买 nike

我似乎无法在这个问题上找到太多内容。我遇到的问题是我需要运行 2 个以上长时间运行的后台服务,但只有第一个注册服务的 ExecuteAsync 被执行。我尝试通过 BackgroundService 实现它并将代码放在 ExecuteAsync 中,我尝试直接实现 IHostedService 并将长时间运行的代码放在 StartAsync 中。

我认为问题是 return Task.CompletedTask;永远不会被调用。
例如,我有两个 Kafka 消费者实现为 BackgroundServices
除了主题和 OnMessage 方法之外,代码看起来都相同

protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
var kafkaEndpoint = _kafkaConfig.Endpoint;

var kafkaTopic = "PhoenixEventStore";

var consumerConfig = new Dictionary<string, object>
{
{ "group.id", "consumer1" },
{ "bootstrap.servers", kafkaEndpoint },
{ "auto.offset.reset", "earliest" }
};

using (var consumer = new Consumer<Null, string>(consumerConfig, null, new StringDeserializer(Encoding.UTF8)))
{
consumer.OnMessage += (obj, msg) =>
{
Log.Information($"Consumer1 Received {msg.Value}");
};

consumer.OnPartitionEOF += (_, end) =>
{
Log.Information($"Consumer1 Reached end of topic {end.Topic} partition {end.Partition}.");
};

consumer.OnError += (_, error) =>
{
Log.Error($"Consumer1 Error: {error}");
};

consumer.Subscribe(new List<string>() { kafkaTopic });

while (!stoppingToken.IsCancellationRequested)
{
consumer.Poll(TimeSpan.FromSeconds(10));
}

//consider setting value that check whether the consumer has stopped polling.
}
return Task.CompletedTask;
}

由于这两个服务都长时间运行,因此 Task.Complete 永远不会被命中。但是,如果我注释掉 while 循环,则会命中两个服务 ExecuteAsync 而不仅仅是第一个注册的服务。

我找到了一个似乎有效的解决方法,但想知道其他人是否有更好的方法。

基本上,我重构了代码,让长时间运行的代码在名为 StartConsumer 的 void 方法中运行,然后让我的 ExecuteAsync 看起来像这样
  protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
Task.Run(() => StartConsumer(stoppingToken));
return Task.CompletedTask;
}

这两个服务都使用注册
services.AddHostedService<MyHostedService1>
services.AddHostedService<MyHostedService2>

最佳答案

我有同样的情况,并且有效。模板是

 protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
try
{
await Foo()
}
catch (Exception ex)
{
_log.Error(ex.Message, exception: ex);
}

await Task.Delay(timeInMlSeconds);
}
}

关于asp.net-core - 多个长时间运行的 IHostedServices 或 BackgroundService 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52856109/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com