• 如何在C#中使用Coravel Queue队列
  • 发布于 2个月前
  • 99 热度
    0 评论

什么是Coravel 

Coravel是一个接近零配置的.NET Core库,旨在简化和加速任务调度、缓存、队列、邮件和事件广播等功能的实现。其本质是通过注入Timer来支持秒级的定时任务。Coravel具有轻量级和简单易用的特点,尤其适用于简单常用的定时任务配置,如EveryMinute、EverySecond等。然而,对于大型和复杂的定时任务需求,Coravel也支持使用Cron表达式进行配置,这使得修改定时任务频率时只需修改配置并重启程序,而无需改动代码。此外,Coravel还提供了其他功能,如缓存和队列等。


官方文档https://docs.coravel.net/

GitHub地址https://github.com/Jamesmh/coravel

用例

使用队列首先要注入服务,通过Services.AddQueue完成。第一种使用方式是从服务容器中取到IQueue对象,然后通过QueueTask方法把具体执行任务添加到队列中,等待时间周期内的调用即可。第二种方法是通过定义继承了IInvocableWithPayload负载接口的负载类,这样的好处是任务功能集中处理,隔离性比较好,当然,在入队更时通过IQueue的QueueInvocableWithPayload<>方法来完成。
using Coravel;
using Coravel.Invocable;
using Coravel.Queuing.Interfaces;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddQueue();
builder.Services.AddTransient<MyQueueInvocable>();

var app = builder.Build();
// 堆代码 duidaima.com
app.MapGet("/addqueue1", (IQueue queue) =>
{
    var guid = queue.QueueTask(() =>
    {
        app.Logger.LogInformation("简单的Queue");
    });
    app.Logger.LogInformation(guid.ToString());
});

app.MapGet("/addqueue2", (IQueue queue) =>
{
    var guid = queue.QueueInvocableWithPayload<MyQueueInvocable, string>("开始Queue,添加时间:" + DateTime.Now);
    app.Logger.LogInformation(guid.ToString());
});

app.Run();

/// <summary>
/// 负载
/// </summary>
public class MyQueueInvocable : IInvocable, IInvocableWithPayload<string>
{
    readonly ILogger<MyQueueInvocable> _logger;
    public MyQueueInvocable(ILogger<MyQueueInvocable> logger)
    {
        _logger = logger;
    }
    public string Payload { get; set; } = string.Empty;
    public async Task Invoke()
    {
        _logger.LogInformation(Payload + ",执行时间:{time}", DateTime.Now);
        await Task.CompletedTask;
    }
}
系统默认队列调度时间是30秒,当然可以通过在appsettings.json中添加如下配置来更改这个时间。
  "Coravel": {
    "Queue": {
      "ConsummationDelay": 5
    }
  }

总结:

Coravel 通过使高级应用程序功能(如任务/作业调度、排队、缓存、邮件(以及更多!))易于访问且易于使用,帮助开发人员快速启动并运行 .NET 应用程序。具有简单、富有表现力和直接的语法。Coravel还提供了一种简单的Queue机制,通过把任务放入队列,系统会自动在30秒执行一次,每次都会把队列中的任务执行完毕。

用户评论