Я использую новую размещенную службу в Net Core 2.1 для получения некоторых сообщений через RabbitMq.
Хотя я могу получить достаточное количество запросов, я не ожидаю десятки или около того одновременно. Но обработка задачи может занять много времени (часы ... дни)
Я не хочу ждать, пока мое сообщение RabbitMq останется так долго - если я получу сообщение, я смогу подтвердить его.
Хорошая идея в этом сценарии - просто запустить новый поток с помощью Task.Run ()?
Я думал об очереди сообщения во внутренней очереди, но не нашел хорошего решения в ядре Linux Net.
Текущий код выглядит так:
public async Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation($"Starting
nameof(NewTaskHandlerService)}");
await _rabbit.SubscribeAsync<CalculationTask>(async (message) =>
{
_logger.LogInformation($"New Task: {message.InstanceId}");
try
{
// this can take ages, I want to start this independently
Task.Run(async () =>
{
using (var scope = _services.CreateScope())
{
var scopedProcessingService =
scope.ServiceProvider
.GetRequiredService<ICalculationTaskHandler>();
await scopedProcessingService.StartCalculationTask(message);
}
});
return new Ack();
}
catch (Exception e)
{
_logger.LogError(0, e, "Error while handling new task. Marking Workflow {} task {} as failed",
message.ParentCalculationId, message.InstanceId);
return new Nack(true);
}
});
}