项目

RabbitMQ后台作业管理器

RabbitMQ是行业标准的消息代理工具。虽然它通常用于进程间通信(消息传递/分布式事件),但在以FIFO(先进先出)顺序存储和执行后台作业方面也非常实用。

ABP提供了Volo.Abp.BackgroundJobs.RabbitMQ NuGet包,用于通过RabbitMQ执行后台作业。

关于如何使用后台作业系统,请参阅 后台作业文档。本文档仅展示如何安装和配置RabbitMQ集成。

安装

使用ABP CLI将Volo.Abp.BackgroundJobs.RabbitMQ NuGet包添加到您的项目:

  • 如果尚未安装,请先安装 ABP CLI
  • 在需要添加 Volo.Abp.BackgroundJobs.RabbitMQ 包的 .csproj 文件所在目录打开命令行(终端)
  • 运行 abp add-package Volo.Abp.BackgroundJobs.RabbitMQ 命令

如需手动安装,请将 Volo.Abp.BackgroundJobs.RabbitMQ NuGet包安装到项目中,并在项目的 ABP模块 类中添加 [DependsOn(typeof(AbpBackgroundJobsRabbitMqModule))] 特性

配置

默认配置

默认配置会自动使用标准端口连接到本地RabbitMQ服务器(localhost)。这种情况下无需任何配置

RabbitMQ连接配置

您可以使用标准配置系统(如通过appsettings.json文件)或选项类来配置RabbitMQ连接

appsettings.json文件配置

这是配置RabbitMQ连接最简单的方式。由于支持Asp.Net Core支持的任何其他配置源(如环境变量),这种方式也非常强大

示例:配置默认RabbitMQ连接

{
  "RabbitMQ": {
    "Connections": {
      "Default": {
        "HostName": "123.123.123.123",
        "Port": "5672"
      }
    }
  }
}

您可以使用ConnectionFactry的任何属性作为连接属性。详细了解这些选项,请参阅RabbitMQ文档

允许定义多个连接。这种情况下,您可以为不同的后台作业类型使用不同的连接(参见下文AbpRabbitMqBackgroundJobOptions章节)

示例:声明两个连接

{
  "RabbitMQ": {
    "Connections": {
      "Default": {
        "HostName": "123.123.123.123"
      },
      "SecondConnection": {
        "HostName": "321.321.321.321"
      }
    }
  }
}

如需连接到RabbitMQ集群,可以使用;字符分隔主机名

示例:连接到RabbitMQ集群

{
  "RabbitMQ": {
    "Connections": {
      "Default": {
        "HostName": "123.123.123.123;234.234.234.234"
      }
    },
    "EventBus": {
      "ClientName": "MyClientName",
      "ExchangeName": "MyExchangeName"
    }
  }
}

AbpRabbitMqOptions

AbpRabbitMqOptions类可用于配置RabbitMQ的连接字符串。您可以在模块的ConfigureServices方法中配置此选项

示例:配置连接

Configure<AbpRabbitMqOptions>(options =>
{
    options.Connections.Default.UserName = "user";
    options.Connections.Default.Password = "pass";
    options.Connections.Default.HostName = "123.123.123.123";
    options.Connections.Default.Port = 5672;
});

这些选项类可以与appsettings.json方式结合使用。在代码中配置选项属性会覆盖配置文件中的值

AbpRabbitMqBackgroundJobOptions

作业队列名称

默认情况下,每种作业类型使用独立的队列。队列名称通过标准前缀和作业名称组合计算得出。默认前缀为AbpBackgroundJobs.。因此,如果作业名称为EmailSending,则RabbitMQ中的队列名称为AbpBackgroundJobs.EmailSending

在后台作业参数类上使用BackgroundJobName特性来指定作业名称。否则,作业名称将是作业类的完整名称(包含命名空间)

作业连接

默认情况下,所有作业类型都使用Default RabbitMQ连接

自定义配置

AbpRabbitMqBackgroundJobOptions可用于自定义作业使用的队列名称和连接

示例:

Configure<AbpRabbitMqBackgroundJobOptions>(options =>
{
    options.DefaultQueueNamePrefix = "my_app_jobs.";
    options.DefaultDelayedQueueNamePrefix = "my_app_jobs.delayed"
    options.PrefetchCount = 1;
    options.JobQueues[typeof(EmailSendingArgs)] =
        new JobQueueConfiguration(
            typeof(EmailSendingArgs),
            queueName: "my_app_jobs.emails",
            connectionName: "SecondConnection",
            delayedQueueName:"my_app_jobs.emails.delayed"
        );
});
  • 此示例将默认队列名称前缀设置为my_app_jobs.,默认延迟队列名称前缀设置为my_app_jobs.delayed。如果不同应用程序使用相同的RabbitMQ服务器,为每个应用程序使用不同的前缀非常重要,以避免相互消费作业
  • 为所有队列设置PrefetchCount
  • 同时为EmailSendingArgs指定了不同的连接字符串

JobQueueConfiguration类的构造函数有一些附加选项:

  • queueName:此作业使用的队列名称。不添加前缀,因此需要指定队列的完整名称
  • DelayedQueueName:用于作业延迟执行的延迟队列名称。不添加前缀,因此需要指定队列的完整名称
  • connectionName:RabbitMQ连接名称(参见上面的连接配置)。此为可选参数,默认值为Default
  • durable(可选,默认:true
  • exclusive(可选,默认:false
  • autoDelete(可选,默认:false
  • PrefetchCount(可选,默认:null)

如需了解durableexclusiveautoDelete选项的详细信息,请参阅RabbitMQ文档,但在大多数情况下,默认配置就是您需要的

另请参阅

在本文档中