版本
语言

RabbitMQ 后台作业管理

RabbitMQ 是一个标准的消息队列中间件,虽然它常用于消息传递/分布式事件,但也非常适合存储 FIFO(先进先出) 顺序的后台作业.

ABP Framework 提供了 Volo.Abp.BackgroundJobs.RabbitMQ 包,将使用 RabbitMQ 来执行后台作业.

参阅 后台作业文档 学习如何使用后台作业系统,本文只介绍了如何安装和配置 RabbitMQ 集成.

安装

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

  • 如果之前没有安装过 ABP CLI,请先安装它.
  • 跳转到待安装后台作业管理的项目目录中(包含 .csproj 文件的目录),打开终端管理器.
  • 执行 abp add-package Volo.Abp.BackgroundJobs.RabbitMQ 命令.

如果你想要手动安装,请先用 NuGet 包管理器安装 Volo.Abp.BackgroundJobs.RabbitMQ 包到指定项目,之后使在你的 模块 上面添加 [DependsOn(typeof(AbpBackgroundJobsRabbitMqModule))] 配置依赖.

配置

默认配置

默认配置将会使用标准端口和主机名(localhost)连接到 RabbitMQ 服务,你不需要进行额外配置.

RabbitMQ 连接

你可以使用 ASP.NET Core 的 标准配置系统 对 RabbitMQ 进行详细配置,比如 appsettings.json 或者是 选项类.

通过 appsettings.json 文件配置

这种方式是配置 RabbitMQ 连接最简单的方式,你可以使用其他的配置源(例如环境变量).这些强大的功能都是由 ASP.NET Core 提供的支持.

示例: 配置默认的 RabbitMQ 连接

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

你可以在配置文件使用所有 ConnectionFactry 的属性,关于这些属性的具体含义,可以查看 RabbitMQ 的 官方文档.

目前我们允许定义多个连接,多连接的情况适用于不同的后台作业,具体配置信息可以参考下面的 RabbitMQ 后台作业配置说明.

示例: 定义两个 RabbitMQ 连接

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

如果需要连接到 RabbitMQ 集群,你可以指定多个 HostName.

示例: 连接到 RabbitMQ 集群

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

使用选项类

AbpRabbitMqOptions 类型用于配置 RabbitMQ 的连接字符串,你可以在 模块ConfigureService 方法中进行配置.

示例: 配置 RabbitMQ 连接

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 文件一起使用.针对同一个属性,在选项类里面对该值进行了设定,会覆盖掉 appsettings.json 的值.

RabbitMQ 后台作业配置说明

后台作业队列的名称

默认情况下,每个后台作业都会使用一个单独的队列,结合标准前缀和作业名称来构造一个完整的队列名称.默认的前缀为 AbpBackgroundJobs,所以有一个作业的名称是 EmailSending 的话,在 RabbitMQ 的队列名称就是 AbpBackgroundJobs.EmailSending.

在后台作业的参数类上,可以使用 BackgroundJobName 特性指定后台作业的名称.否则的话,后台作业的名称将会是后台作业类的全名(也包含命名空间).

后台作业使用的连接

默认情况下,后台作业都会使用 Default 作为默认连接.

自定义

AbpRabbitMqBackgroundJobOptions 可以自定义队列名和作业使用的 RabbitMQ 连接.

**示例: **

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 服务,设置不同的前缀可以避免执行其他项目的后台作业.
  • 设置了预取数量, 用于所有队列.
  • 这里还设置了 EmailSendingArgs 绑定的 RabbitMQ 连接.

JobQueueConfiguration 类的构造函数中,还有一些其他的可选参数.

  • queueName: 指定后台作业对应的队列名称(全名).
  • DelayedQueueName: 指定后台延迟执行的作业对于的队列名称(全名).
  • connectionName: 后台作业对应的 RabbitMQ 连接名称,默认是 Default.
  • durable: 可选参数,默认为 true.
  • exclusive: 可选参数,默认为 false.
  • autoDelete: 可选参数,默认为 false.
  • PrefetchCount (可选参数, 默认为: null)

如果你想要更多地了解 durable,exclusive,autoDelete 的用法,请阅读 RabbitMQ 提供的文档.

另请参阅

本页对您有帮助吗?
请进行选择。
感谢您的宝贵意见!

请注意,虽然我们无法回复反馈意见,但我们的团队会根据您的意见改进体验。

在本文档中
Mastering ABP Framework Book
掌握 ABP 框架

本书将帮助你全面了解框架和现代Web应用程序开发技术。