Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何覆盖MassTransit默认exchange和队列拓扑约定?_C#_.net Core_Rabbitmq_Masstransit - Fatal编程技术网

C# 如何覆盖MassTransit默认exchange和队列拓扑约定?

C# 如何覆盖MassTransit默认exchange和队列拓扑约定?,c#,.net-core,rabbitmq,masstransit,C#,.net Core,Rabbitmq,Masstransit,正如[在我关于SO的一个问题中]()所指出的,MassTransit for RabbitMQ会自动为给定的简单配置创建一定数量的队列和交换: 交易所,所有球迷: ConsoleApp1:ProgramyourMessage:持久 VP0003748\u dotnet\u bus\u 6n9oyyfzxhyx9ybobdmpj8qeyt:自动删除和持久 测试队列:持久 队列: VP0003748\u dotnet\u bus\u 6n9oyyfzxhyx9ybobdmpj8qeyt:x-6

正如[在我关于SO的一个问题中]()所指出的,MassTransit for RabbitMQ会自动为给定的简单配置创建一定数量的队列和交换:

交易所,所有球迷:

  • ConsoleApp1:ProgramyourMessage
    :持久
  • VP0003748\u dotnet\u bus\u 6n9oyyfzxhyx9ybobdmpj8qeyt
    :自动删除和持久
  • 测试队列
    :持久
队列:

  • VP0003748\u dotnet\u bus\u 6n9oyyfzxhyx9ybobdmpj8qeyt
    :x-60000
  • 测试队列
    :持久
然而,我发现无法覆盖这些交换和队列的命名有点沮丧。我能做些什么来改变这一点吗

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

我理解
test\u queue
因为这是我认为足够公平的事情。
类型很容易进行更改/重构。

这是一种简单有效的方法:

但最好在这里删除一些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}";
    }
}
公共类BusEnvironmentNameFormatter:IEntityNameFormatter
{
私有只读IEntityNameFormatter_原件;
私有只读字符串_前缀;
公共总线环境名称格式化程序(IEntityNameFormatter原件,SomeAppSettingsSection总线设置)
{
_原件=原件;
_prefix=string.IsNullOrWhiteSpace(busSettings.Environment)
?string.Empty//无前缀
:$“{busSettings.Environment}:;//自定义前缀
}
//用于重命名交易所
公共字符串FormattEntityName()
{
var original=_original.formattentityname();
返回格式(原件);
}
//使用此选项可以重命名队列
公共字符串格式(原始字符串)
{
返回字符串.IsNullOrWhiteSpace(_前缀)
起初的
:$“{u前缀}{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);
    }));
});
var-busSettings=busConfigSection.Get();
var rabbitMqSettings=rabbitMqConfigSection.Get();
services.AddMassTransit(scConfig=>
{
scConfig.AddConsumers(consumerAssemblies);
scConfig.AddBus(provider=>Bus.Factory.CreateUsingRabbitMq(rmqConfig=>
{
rmqConfig.UseExtensionsLogging(provider.GetRequiredService());
//强制序列化默认值:null、false等
rmqConfig.ConfigureJsonSerializer(jsonSettings=>
{
jsonSettings.DefaultValueHandling=DefaultValueHandling.Include;
返回jsonSettings;
});
var nameFormatter=新的总线环境nameFormatter(rmqConfig.MessageTopology.EntityNameFormatter,总线设置);
var host=rmqConfig.host(新Uri(rabbitMqSettings.ConnectionString),hostConfig=>
{
Username(rabbitMqSettings.Username);
hostConfig.Password(rabbitMqSettings.Password);
});
//具有自定义命名的端点
rmqConfig.ReceiveEndpoint(主机,nameFormatter.Format(busSettings.Endpoint),epConfig=>
{
epConfig.PrefetchCount=busSettings.MessagePrefetchCount;
epConfig.UseMessageRetry(x=>x.Interval(busSettings.MessageRetryCount,busSettings.MessageRetryInterval));
epConfig.UseInMemoryOutbox();
//TODO:将消息绑定到此队列/端点
epConfig.MapMessagesToConsumers(提供程序、总线设置);
});
//交换的自定义命名
rmqConfig.MessageTopology.SetEntityNameFormatter(nameFormatter);
}));
});

队列的名称可以通过以下方式使用IRabbitMqBusFactoryConfigurator的OverridedFaultBusEndpointQueueName方法更改

var bus = Bus.Factory.CreateUsingRabbitMq(sbc =>
{
    sbc.Host("rabbitmq://localhost/");

    sbc.OverrideDefaultBusEndpointQueueName("endpoint");
});

您可能会阅读文档:and@Chris Patterson文档没有说明如何更改临时交换/队列,例如
VP0003748\u dotnet\u bus\u 7qyyyyyfxhbykj9dbdmpks5xd5
VP0003748\u dotnet\u bus\u 7qyyyyyyfxhbykj9dbdmpks5xd5