我创建了一个带有 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"]
最佳答案
感谢您的回复。我设法解决了这个问题。我的发现如下。
要连接到另一个 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/