gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:48:42 26 4
gpt4 key购买 nike

正如[在我关于 SO 的一个问题] ( Why a simple configuration in MassTransit creates 2 queues and 3 exchanges? ) 中指出的那样,MassTransit for RabbitMQ 会自动创建一定数量的队列并交换给定的简单配置:

Exchanges, all fanouts:

  • ConsoleApp1:Program-YourMessage: Durable
  • VP0003748_dotnet_bus_6n9oyyfzxhyx9ybobdmpj8qeyt: Auto-delete and Durable?
  • test_queue: Durable

Queues:

  • VP0003748_dotnet_bus_6n9oyyfzxhyx9ybobdmpj8qeyt: x-expire 60000
  • test_queue: Durable


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

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

我明白 test_queue因为这是我决定的足够公平的事情。
类型很容易受到更改/重构的影响。

最佳答案

这是一个简单而有效的方法: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);
}));
});

关于c# - 如何覆盖 MassTransit 默认交换和队列拓扑约定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56074676/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com