【问题标题】:RabbitMQ Connection resetRabbitMQ 连接重置
【发布时间】:2018-05-28 08:33:45
【问题描述】:

我正在尝试使用 java 代码将一个简单的 RabbitMQ 连接到我的服务器(它正在执行 RabbitMQ 服务)。 执行以下代码 (source here) 会给我 java.net.SocketException: Connection Reset 异常。

import java.io.*;
import java.security.*;


import com.rabbitmq.client.*;

public class test
{
    public static void main(String[] args) throws Exception
    {

        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("myIP");  //myIP is just dummy text, I have a real IP there
        factory.setPort(5672);
        factory.setUsername("admin");
        factory.setPassword("sesgo");
        factory.setVirtualHost("vSESGO");

        factory.useSslProtocol();

        Connection conn = factory.newConnection();
        Channel channel = conn.createChannel();

        channel.queueDeclare("rabbitmq-java-test", false, true, true, null);
        channel.basicPublish("", "rabbitmq-java-test", null, "Hello, World".getBytes());


        GetResponse chResponse = channel.basicGet("rabbitmq-java-test", false);
        if(chResponse == null) {
            System.out.println("No message retrieved");
        } else {
            byte[] body = chResponse.getBody();
            System.out.println("Recieved: " + new String(body));
        }


        channel.close();
        conn.close();
    }
}

我在网上找了答案,已经试过了:

  1. 验证服务器是否打开了我要连接的端口。
  2. 验证客户端不会阻止我与防火墙等的连接。
  3. 在 RabbitMQ 上创建一个新的虚拟主机并为其授予权限。
  4. 在服务器端验证 iptables 不会阻止我。

似乎没有任何效果,有什么想法吗?

此处的完整堆栈跟踪:

This trust manager trusts every certificate, effectively disabling peer verification. This is convenient for local development but prone to man-in-the-middle attacks. Please see http://www.rabbitmq.com/ssl.html#validating-cerficates to learn more about peer certificate validation.
Exception in thread "main" java.net.SocketException: Connection reset
 at java.net.SocketInputStream.read(Unknown Source)
 at java.net.SocketInputStream.read(Unknown Source)
 at sun.security.ssl.InputRecord.readFully(Unknown Source)
 at sun.security.ssl.InputRecord.read(Unknown Source)
 at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
 at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
 at sun.security.ssl.SSLSocketImpl.writeRecord(Unknown Source)
 at sun.security.ssl.AppOutputStream.write(Unknown Source)
 at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
 at java.io.BufferedOutputStream.flush(Unknown Source)
 at java.io.DataOutputStream.flush(Unknown Source)
 at com.rabbitmq.client.impl.SocketFrameHandler.sendHeader(SocketFrameHandler.java:147)
 at com.rabbitmq.client.impl.SocketFrameHandler.sendHeader(SocketFrameHandler.java:153)
 at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:294)
 at com.rabbitmq.client.impl.recovery.RecoveryAwareAMQConnectionFactory.newConnection(RecoveryAwareAMQConnectionFactory.java:63)
 at com.rabbitmq.client.impl.recovery.AutorecoveringConnection.init(AutorecoveringConnection.java:99)
 at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:921)
 at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:880)
 at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:838)
 at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:990)
 at test.main(test.java:25)

【问题讨论】:

  • 给出完整的堆栈跟踪错误
  • 当您创建连接时,您在此或创建通道时是否有错误?
  • 基于调试器,给我错误的行是创建连接的行: Connection conn = factory.newConnection();
  • 所以验证你提供的信息,比如主机和端口(它不是主机的本地主机?)
  • 你可以访问 RabbitMQ 服务器吗?如果是这样,您能否检索日志 - 确保您有一个连接到交换 amq.rabbitmq.log 的队列,绑定“#”以获取所有日志消息。

标签: java rabbitmq


【解决方案1】:

我在这里遇到了同样的问题:RabbitMQ Connection reset Exception。 Windows 的解决方案是在 rabbit 配置文件中为证书和密钥的路径添加反斜杠。

【讨论】:

    【解决方案2】:

    我不知道这是否适用于您的情况,但我最近在测试 RabbitMQ 3.8.3 时解决了类似的情况,原因是我引用的密钥受密码保护,但我未能提供RabbitMQ 配置中的密码,如下所示:

    ssl_options.password = password
    

    不幸的是,即使将日志级别设置为调试,RabbitMQ 日志中也没有任何内容。通过各种客户端进行测试时,建立了连接,但 RabbitMQ 立即发送了连接重置。

    【讨论】:

      【解决方案3】:

      我遇到了同样的错误,我的问题出在 rabbitmq.conf 文件中。我试图将 JKS 文件用于以下 ssl 选项。生成我自己的自签名 .pem 文件可以帮助解决这个问题。我非常仔细地遵循了本指南https://www.codetd.com/en/article/12031242

      ssl_options.cacertfile = /etc/rabbitmq/ca_certificate.pem
      ssl_options.certfile   = /etc/rabbitmq/server_certificate.pem
      ssl_options.keyfile    = /etc/rabbitmq/server_key.pem
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-28
        • 1970-01-01
        • 2014-10-21
        • 2022-11-27
        • 2018-08-05
        • 1970-01-01
        相关资源
        最近更新 更多