[英]How do I find out why my RabbitMQ connection is failing?
几天来,我一直在用头撞墙。
我在 docker 中设置了一个非常基本的 rabbitMQ 服务。我可以编写一个简单的控制台应用程序来写入和读取该服务。 我也可以访问rabbitMQ web门户没问题。
但是,当我尝试从我正在处理的相当复杂的 web 应用程序内部使用它时,它每次在factory.CreateConnection()
方法上都失败,并出现None of the specified endpoints were reachable
错误。 我的第一个想法是从 IISExpress 访问时出现问题。 所以,我尝试了以下方法来确定我哪里出错了:
所以现在我知道它在控制台中工作,并且它通过 IISExpress 在有和没有 SSL 的情况下工作。然后我在失败的应用程序中尝试了以下操作(剧透,这些都不起作用):
CreateConnection()
代码移到构造函数之外,这样它就不会被 Ninject 实例化。在每种情况下,我都会得到相同的结果。 通过工作应用程序(使用相同的代码)时,我在 output 中得到了这个结果:
rabbitMQTest_1 | 2020-08-21 16:24:28.820 [info] <0.11124.0> accepting AMQP connection <0.11124.0> (198.19.0.1:57186 -> 198.19.0.2:5672)
rabbitMQTest_1 | 2020-08-21 16:24:28.899 [info] <0.11124.0> connection <0.11124.0> (198.19.0.1:57186 -> 198.19.0.2:5672): user 'testuser' authenticated and granted access to vhost 'test-vhost'
rabbitMQTest_1 | 2020-08-21 16:24:28.983 [info] <0.11124.0> closing AMQP connection <0.11124.0> (198.19.0.1:57186 -> 198.19.0.2:5672, vhost: 'test-vhost', user: 'testuser')
当尝试通过失败的应用程序时,我得到的是:
rabbitMQTest_1 | 2020-08-21 16:26:30.640 [info] <0.11354.0> accepting AMQP connection <0.11354.0> (198.19.0.1:57202 -> 198.19.0.2:5672)
rabbitMQTest_1 | 2020-08-21 16:26:40.613 [error] <0.11354.0> closing AMQP connection <0.11354.0> (198.19.0.1:57202 -> 198.19.0.2:5672):
rabbitMQTest_1 | {handshake_timeout,frame_header}
工作应用程序和非工作应用程序之间唯一的区别是后者通过内部应用程序进行安全登录和身份验证。
作为参考,这是我的 docker.yml 文件:
version: '3.4'
services:
rabbitMQTest:
image: rabbitmq-local
hostname: localhost
build:
context: .
dockerfile: Dockerfile
ports:
- 15672:15672
- 5672:5672
我的 Docker 档案:
FROM rabbitmq:3-management
ADD rabbitmq.conf /etc/rabbitmq/
ADD definitions.json /etc/rabbitmq/
RUN chown rabbitmq:rabbitmq /etc/rabbitmq/rabbitmq.conf /etc/rabbitmq/definitions.json
RUN rabbitmq-plugins enable rabbitmq_management
CMD ["rabbitmq-server"]
我的配置文件:
loopback_users = none
# IPv4
listeners.tcp.default = 5672
## HTTP listener and embedded Web server settings.
management.tcp.port = 15672
# Load queue definitions
management.load_definitions = /etc/rabbitmq/definitions.json
#Ignore SSL
ssl_options.verify = verify_peer
ssl_options.fail_if_no_peer_cert = true
这是用于连接和写入 rabbitMQ 的沼泽标准 C# 代码:
static void Main(string[] args)
{
var factory = new ConnectionFactory() { HostName = "localhost", UserName = "testuser", Password = "testpassword", VirtualHost = "test-vhost"};
using (var connection = factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
channel.ExchangeDeclare("MyExchange", "direct", true);
channel.QueueDeclare(queue: "MyQueue",
durable: true,
exclusive: false,
autoDelete: false,
arguments: null);
channel.QueueBind("MyQueue", "MyExchange", "routingKey");
var message = "Howdy";
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: "",
routingKey: "routingKey",
basicProperties: null,
body: body);
Console.WriteLine(" [x] Send {0}", message);
}
}
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}
正如我所说,我现在能想到的唯一区别是我的非工作应用程序具有其他人没有的内部身份验证。 我不知道这是否有所作为。 我现在需要做的是深入挖掘。 有谁知道从 rabbitMQ 获取更多日志记录信息的方法吗? 特别是,在握手拒绝举行的那 10 秒内发生了什么? 它只是在没有任何信息的情况下掉落的事实让我抓狂!
或者,如果有人直接回答了这个问题,我将不胜感激!
谢谢。
我自己回答这个。 也许这可以帮助遇到类似问题的人。
问题是 RabbitMQ 所依赖的 dll 版本。 我注意到我的应用程序版本略有不同。 通过绑定重定向到 RabbitMQ 所依赖的那些,我解决了这个问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.