rabbitmq - Masstransit 无法从 docker 容器访问主机 RabbitMQ

标签 rabbitmq .net-core masstransit

我创建了一个带有 docker 支持的简单 .net core 控制台应用程序。正在关注
Masstransit 代码无法连接到主机上的 RabbitMQ 实例。但使用 RabitMq.Client 的类似实现能够连接到主机 RabbitMQ 实例。

公共(public)交通抛出

MassTransit.RabbitMqTransport.RabbitMqConnectionException: Connect failed: [email protected]:5672/ ---> RabbitMQ.Client.Exceptions.BrokerUnreachableException:

主机ip:192.168.0.9

使用公共(public)交通

        string rabbitMqUri = "rabbitmq://192.168.0.9/";
        string userName = "ctas";
        string password = "ctas@123";
        string assetServiceQueue = "hello";


       var bus = Bus.Factory.CreateUsingRabbitMq(cfg =>
       {
           var host = cfg.Host(new Uri(rabbitMqUri), hst =>
           {
               hst.Username(userName);
               hst.Password(password);
           });

           cfg.ReceiveEndpoint(host,
                assetServiceQueue, e =>
                {
                    e.Consumer<AddNewAssetReceivedConsumer>();

                });

       });


        bus.Start();
        Console.WriteLine("Service Running.... Press enter to exit");
        Console.ReadLine();
        bus.Stop();

使用 RabbitMQ 客户端

        public static void Main()
    {
        var factory = new ConnectionFactory();
        factory.UserName = "ctas";
        factory.Password = "ctas@123";
        factory.VirtualHost = "watcherindustry";
        factory.HostName = "192.168.0.9";
        using (var connection = factory.CreateConnection())
        using (var channel = connection.CreateModel())
        {
            channel.QueueDeclare(queue: "hello",
                                 durable: false,
                                 exclusive: false,
                                 autoDelete: false,
                                 arguments: null);

            var consumer = new EventingBasicConsumer(channel);
            consumer.Received += (model, ea) =>
            {
                var body = ea.Body;
                var message = Encoding.UTF8.GetString(body);
                Console.WriteLine(" [x] Received {0}", message);
            };
            channel.BasicConsume(queue: "hello",
                                 autoAck: true,
                                 consumer: consumer);

            Console.WriteLine(" Press [enter] to exit.");
            Console.ReadLine();
        }
    }

Docker 文件

FROM microsoft/dotnet:1.1-runtime
ARG source
WORKDIR /app
COPY ${source:-obj/Docker/publish} .
ENTRYPOINT ["dotnet", "TestClient.dll"]

Dependencies

最佳答案

感谢您的回复。我设法解决了这个问题。我的发现如下。

要连接到另一个 docker 容器上的rabbitmq 实例,它们必须移动/连接到同一网络。去做这个 创建一个newtork

   docker network create -d bridge my_bridge

将应用程序和rabbitmq容器连接到同一网络

   docker network connect my_bridge <container name>

对于masstransit uri,请使用rabbitmq容器该网络或容器名称上的IP

从 docker 容器上的应用程序连接主机的rabbitmq 实例。 Masstransit URI 应包含机器名称(我尝试了 IP,但没有成功)

关于rabbitmq - Masstransit 无法从 docker 容器访问主机 RabbitMQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45589304/

相关文章:

python - 如何在 celery 中将任务从一个队列移动到另一个队列

javascript - rabbitmq中当前队列大小

.net - 复杂消息和大众运输反序列化

unit-testing - 使用 InMemoryTestFixture 测试 MassTransit Consumer

masstransit - 消息总线中的总线发现

java - RabbitMQ 消费者线程池随着每个请求而增加

python - Celery:长期专用的单一任务与短期的多项任务

c# - 将 DbContext 添加到所有类,而不仅仅是 .NET Core 中的 Controller

c# - 来自 launchsettings.json 的环境变量正在测试中使用吗?

arrays - 复杂对象的 json 数组在发布时始终为 null