Masstransit - Rabbit MQ虚拟主机。

问题描述 投票:2回答:1

我正在使用大众运输和连接到我的兔子经纪人。

 string uri1 = @"rabbitmq://myusername:mypassword@myip/myvirtualhost/myqueue";

我一直得到一个ConfigurationException was unhandled。

在服务总线创建过程中抛出了一个异常{System.Collections.ListDictionaryInternal.NodeKeyValueCollection} {"Failed to start bus services"} at MassTransit.ServiceContainer. Start() in d:\BuildAgent-03work\aa063b4295dfc097\src\MassTransitServiceContainer.cs:第83行 at MassTransit.ServiceBus.Start() in d:\BuildAgent-03work\aa063b4295dfc097\src\MassTransit\ServiceBus.cs:第369行 at MassTransit.Builders.ServiceBusBuilderImpl. Build() in d:BuildAgent-03work\aa063b4295dfc097\src\MassTransit\Configuration\Builders\ServiceBusBuilderImpl.cs:行84 at MassTransit.BusConfigurators.ServiceBusConfiguratorImpl. CreateServiceBus() in d:\BuildAgent-03\work\aa063b4295dfc097\src\MassTransit/Configuration\BusConfigurators\ServiceBusConfiguratorImpl.cs:第171行 at MassTransit. ServiceBusFactory.New(Action`1 configure) in d:/BuildAgent-03/work/aaaa063b4295dfc097/src/MassTransit/Configuration/ServiceBusFactory.cs:第44行。

真正奇怪的是,它不需要指定虚拟主机就能工作,但他们当然会去到错误的虚拟主机。

然后我下载了rabbitMQ库,它用我的凭证很好地连接到正确的虚拟主机。这就是我如何知道我的凭证,虚拟主机设置好了。我甚至还添加了一个队列,以防是这个问题。 是不是Masstransit有什么错误?我真的看不出我做错了什么。我正在考虑不使用Masstransit,自己编程一个轻量级版本。

我甚至把这个复制粘贴到 https:/github.comMassTransitMassTransitblobv2.7.2srcTransportsMassTransit.Transports.RabbitMqRabbitMqEndpointAddress.cs#L167。 我的解决方法是检查它是否正确地修剪了虚拟主机,它是正确的。我真的很困惑。` static readonly Regex regex = new Regex(@"^[A-Za-z0-9-)。.:]+$");

    public static RabbitMqEndpointAddress Parse(Uri address)
    {
        Guard.AgainstNull(address, "address");

        if (string.Compare("rabbitmq", address.Scheme, true) != 0)
            throw new RabbitMqAddressException("The invalid scheme was specified: " + address.Scheme ?? "(null)");

        var connectionFactory = new ConnectionFactory
        {
            HostName = address.Host,
            UserName = "",
            Password = "",
        };

        if (address.IsDefaultPort)
            connectionFactory.Port = 5672;
        else if (!address.IsDefaultPort)
            connectionFactory.Port = address.Port;

        if (!address.UserInfo.IsEmpty())
        {
            if (address.UserInfo.Contains(":"))
            {
                string[] parts = address.UserInfo.Split(':');
                connectionFactory.UserName = parts[0];
                connectionFactory.Password = parts[1];
            }
            else
                connectionFactory.UserName = address.UserInfo;
        }

        string name = address.AbsolutePath.Substring(1);
        string[] pathSegments = name.Split('/');
        if (pathSegments.Length == 2)
        {
            connectionFactory.VirtualHost = pathSegments[0];
            name = pathSegments[1];
        }

        ushort heartbeat = address.Query.GetValueFromQueryString("heartbeat", connectionFactory.RequestedHeartbeat);
        connectionFactory.RequestedHeartbeat = heartbeat;

       VerifyQueueOrExchangeNameIsLegal(name);

        return new RabbitMqEndpointAddress(address, connectionFactory, name);
    }
    static void VerifyQueueOrExchangeNameIsLegal(string path)
    {
        Match match = _regex.Match(path);

        if (!match.Success)
            throw new RabbitMqAddressException(FormatErrorMsg);
    }

    const string FormatErrorMsg =
      "The path can be empty, or a sequence of these characters: letters, digits, hyphen, underscore, period, or colon.";


    private static void Main(string[] args)
    {

        string uri1 = @"rabbitmq://username:[email protected]/vhost/queue";
        IServiceBus serviceBus;

        var result =  Parse(new Uri(uri1));

        serviceBus = ServiceBusFactory.New(sbc =>
        {
            sbc.UseRabbitMq();
            sbc.ReceiveFrom(uri1);
            sbc.Subscribe(c => c.Consumer<SendEmailConsumer>());
        });

        IPublish publishMessage = new MassTransitPublisher(uri1);

        publishMessage.Publish(new SendEmail
            {
                EmailFrom = "*@8.co.za",
                EmailTo = "*@*.co.za",
                Subject = "hello",
                Body = "hello"
            });

        Console.ReadKey();


        JobRunner jobRunner = new JobRunner();

        jobRunner.Start();

        Console.ReadKey();
    }`

任何帮助将被感激或任何其他我可以尝试让这个工作。

c# rabbitmq masstransit
1个回答
1
投票

你使用的是什么版本的MassTransit?

我们删除了从Uri中声明用户名和密码的功能(所以它不会出现在日志中),你必须通过API来做。

请看 https:/groups.google.comdmsgmasstransit-discuss4m5Vf04oRWMhujvVh1HSdwJ。.

sbc.UseRabbitMq(x => 
                x.ConfigureHost("rabbitmq://yourhost/yourvhost/yourqueue", 
                x=> x.UserName, 
                x.Password))
© www.soinside.com 2019 - 2024. All rights reserved.