如何覆盖 MassTransit 默认交换和队列拓扑约定?

2024-03-04

正如[在我关于SO的一个问题中]所指出的(为什么 MassTransit 中的简单配置会创建 2 个队列和 3 个交换机? https://stackoverflow.com/questions/56064182/why-a-simple-configuration-in-masstransit-creates-2-queues-and-3-exchanges),MassTransit for RabbitMQ 自动创建一定数量的队列并交换给定的简单配置:

交易所,所有扇出:

  • ConsoleApp1:Program-YourMessage: 耐用的
  • VP0003748_dotnet_bus_6n9oyyfzxhyx9ybobdmpj8qeyt:自动删除且持久?
  • test_queue: 耐用的

Queues:

  • VP0003748_dotnet_bus_6n9oyyfzxhyx9ybobdmpj8qeyt: x-过期 60000
  • test_queue: 耐用的

然而,我发现无法覆盖这些交换器和队列的命名有点令人沮丧。我能做些什么来改变这一点吗?

例如,如果您重构某种类型或命名空间,您最终可能会因为大量不再使用的交换而污染您的 RabbitMQ 实例 =/

我明白test_queue因为这是我的决定,非常公平。 类型很容易发生更改/重构。


这是一个简单而有效的方法:https://bartwullems.blogspot.com/2018/09/masstransitchange-exchange-naming.html https://bartwullems.blogspot.com/2018/09/masstransitchange-exchange-naming.html

但最好在这里放置一些 dotnet 核心代码,以帮助任何刚开始使用的人。

我们基于配置的自定义格式化程序:

public class BusEnvironmentNameFormatter : IEntityNameFormatter
{
    private readonly IEntityNameFormatter _original;
    private readonly string _prefix;

    public BusEnvironmentNameFormatter(IEntityNameFormatter original, SomeAppSettingsSection busSettings)
    {
        _original = original;
        _prefix = string.IsNullOrWhiteSpace(busSettings.Environment)
            ? string.Empty // no prefix
            : $"{busSettings.Environment}:"; // custom prefix
    }

    // Used to rename the exchanges
    public string FormatEntityName<T>()
    {
        var original = _original.FormatEntityName<T>();
        return Format(original);
    }

    // Use this one to rename the queue
    public string Format(string original)
    {
        return string.IsNullOrWhiteSpace(_prefix)
            ? original
            : $"{_prefix}{original}";
    }
}

然后要使用它,我们会做这样的事情:

var busSettings = busConfigSection.Get<SomeAppSettingsSection>();
var rabbitMqSettings = rabbitMqConfigSection.Get<SomeOtherAppSettingsSection>();

services.AddMassTransit(scConfig =>
{
    scConfig.AddConsumers(consumerAssemblies);

    scConfig.AddBus(provider => Bus.Factory.CreateUsingRabbitMq(rmqConfig =>
    {
        rmqConfig.UseExtensionsLogging(provider.GetRequiredService<ILoggerFactory>());

        // Force serialization of default values: null, false, etc
        rmqConfig.ConfigureJsonSerializer(jsonSettings =>
        {
            jsonSettings.DefaultValueHandling = DefaultValueHandling.Include;
            return jsonSettings;
        });

        var nameFormatter = new BusEnvironmentNameFormatter(rmqConfig.MessageTopology.EntityNameFormatter, busSettings);
        var host = rmqConfig.Host(new Uri(rabbitMqSettings.ConnectionString), hostConfig =>
        {
            hostConfig.Username(rabbitMqSettings.Username);
            hostConfig.Password(rabbitMqSettings.Password);
        });

        // Endpoint with custom naming
        rmqConfig.ReceiveEndpoint(host, nameFormatter.Format(busSettings.Endpoint), epConfig =>
        {
            epConfig.PrefetchCount = busSettings.MessagePrefetchCount;
            epConfig.UseMessageRetry(x => x.Interval(busSettings.MessageRetryCount, busSettings.MessageRetryInterval));
            epConfig.UseInMemoryOutbox();

            //TODO: Bind messages to this queue/endpoint
            epConfig.MapMessagesToConsumers(provider, busSettings);
        });

        // Custom naming for exchanges
        rmqConfig.MessageTopology.SetEntityNameFormatter(nameFormatter);
    }));
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何覆盖 MassTransit 默认交换和队列拓扑约定? 的相关文章

随机推荐

  • IIS 的 URL 重写规则替换每个页面中的文件夹路径

    我的网站项目有 300 多个页面 随着时间的推移 我们创建了一个安全的新服务器 该服务器专门用于网站中的所有图像 所以这是场景 当前图像的实现 在 aspx 中 在 css 中 http www mysite com assets comm
  • 朴素高斯预测概率仅返回 0 或 1

    我从 scikit sklearn 训练了 GaussianNB 模型 当我调用该方法时classifier predict proba它仅在新数据上返回 1 或 0 预计会返回预测正确与否的置信度百分比 我怀疑它能否对以前从未见过的新数据
  • Android 中将 ImageView 置于另一个 ImageView 中

    好吧 我必须将一个 ImageView 放入另一个 ImageView 中 它较小并且必须正好位于中心 我有两个针对不同屏幕分辨率缩放的图像 但我只能在一部手机上进行测试 我想知道是否使用 dpi 设置第二个图像的高度和宽度以适合我的屏幕分
  • 使用 FUSE 在 python 中创建临时文件

    我正在尝试使用 python fuse 编写程序 但无法记录文件 我的 file class 看起来像这样 class FuseFile object def init self path flags mode debug path deb
  • 获取 SWT 视图的大小

    我正在尝试确定 SWT 视图的大小 以便可以在插件中正确布局小部件 我正在使用 Java 8 运行 Eclipse Neon 我正在使用的代码如下 import org eclipse swt SWT import org eclipse
  • 实体框架:连接两个表和 where 子句

    我在使用实体框架和 PostgreSQL 时遇到问题 有人知道如何连接两个表并将第二个表用作 where 子句吗 我想在实体框架中执行的选择将在 SQL 中 SELECT ai id ai title ai description ai c
  • 如何包含绝对位置div?

    我有这个小提琴here http jsfiddle net 45atnh0u 这是下图 我需要实现的是让黑色容器根据里面的项目 项目是A B C 动态扩展 输出必须是 无需静态设置高度 我的html是 div class container
  • 相当于 gcc/g++ 中的 __declspec( bare )

    相当于什么 declspec naked in gcc g declspec naked 实际上用于声明一个没有任何尾声和序言的函数 在某些体系结构上 gcc 支持称为 naked 的属性 最近的gcc docs http gcc gnu
  • 如何修复拖放 JavaScript

    我创建了这个页面和脚本来使用 JavaScript HTML CSS 拖放对象 我聚焦对象跟随鼠标将鼠标悬停在页面项目上并将其放在容器上 但我的问题是拖放不起作用 这是代码 HTML div class container span spa
  • 按年份分割数据

    我有这样的数据 ID ATTRIBUTE START END 1 A 01 01 2000 15 03 2010 1 B 05 11 2001 06 02 2002 2 B 01 02 2002 08 05 2008 2 B 01 06 2
  • 运行 JUnit 测试时 Spring Security 不调用我的自定义身份验证过滤器

    我正在尝试按照以下方式使用 Spring Security 实现自定义无状态身份验证article http www future processing pl blog exploring spring boot and spring se
  • PHP 中正则表达式的解析器?

    我需要将正则表达式解析为 PHP 中的组件 我创建或执行正则表达式没有问题 但我想显示有关正则表达式的信息 例如列出捕获组 将重复字符附加到其目标 整个项目是一个 WordPress 插件 它提供了有关重写规则的信息 这些规则是具有替换模式
  • 从循环打印输出中删除最后一个逗号 JAVA

    我在循环打印输出时遇到了一个小问题 String str1 null for int row 0 row
  • 自动过滤单元格包含确切的特定数字

    我有一个列 其值类似于以下示例 Size 4 1 4 1 24 4 1 4 5 10 2 14 5 3 4 5 我需要设置一个过滤器来获取包含特定数字的单元格 例如 4 预期结果是 4 1 4 4 1 3 4 5 如果我使用通配符 4 作为
  • 尝试安装`genicam`的诗歌中的“无法找到安装候选人” - 如何调试?

    我刚刚使用新的 Windows 10 机器安装了诗歌install poetry py脚本 我刚刚将我的 python 应用程序依赖管理转换为pyproject toml with poetry 它适用于我的大多数依赖项 但不适用于geni
  • 旋转后平移手势行为不正确

    我有与下面链接类似的问题 为什么我在旋转后使用 平移 会使视图向相反方向移动 https stackoverflow com questions 11707001 why i use pan after rotae will make vi
  • Pandas 使用 0.21.0 对 FutureWarning 进行切片

    我试图选择数据帧子集的子集 仅选择一些列 然后对行进行过滤 df loc df a isin Apple Pear Mango a b f g 但是 我收到错误 Passing list likes to loc or with any m
  • 通过自定义选择器的 ListView 项目背景

    是否可以通过列表选择器将自定义背景应用于每个列表视图项目 默认选择器指定 android color transparent为了state focused false 情况 但将其更改为某些自定义可绘制对象不会影响未选择的项目 罗曼 盖伊似
  • 在 python 中逐行迭代大型 .xz 文件

    我有一个很大的 xz 文件 几千兆字节 它充满了纯文本 我想处理文本以创建自定义数据集 我想逐行阅读它 因为它太大了 有人知道该怎么做吗 我已经尝试过这个如何打开并读取内存中的LZMA文件 https stackoverflow com q
  • 如何覆盖 MassTransit 默认交换和队列拓扑约定?

    正如 在我关于SO的一个问题中 所指出的 为什么 MassTransit 中的简单配置会创建 2 个队列和 3 个交换机 https stackoverflow com questions 56064182 why a simple con