无法连接 Spring AMQP / Rabbit MQ:org.springframework.amqp.AmqpConnectException:java.net.ConnectException

Posted

技术标签:

【中文标题】无法连接 Spring AMQP / Rabbit MQ:org.springframework.amqp.AmqpConnectException:java.net.ConnectException:连接被拒绝:连接【英文标题】:Unable to connect Spring AMQP / Rabbit MQ : org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Connection refused: connect 【发布时间】:2016-02-28 04:15:48 【问题描述】:

我是 Spring AMQP/Rabbit MQ 的新手。

我在我的项目中使用 Spring AMQP / Rabbit MQ。运行tomcat后出现以下错误:

org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer - 消费者引发异常,如果连接工厂支持,处理可以重新启动。

异常摘要:org.springframework.amqp.AmqpConnectException: java.net.ConnectException:连接被拒绝:连接

下面是配置文件:

spring-amqp.xml

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:rabbit="http://www.springframework.org/schema/rabbit"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/rabbit        http://www.springframework.org/schema/rabbit/spring-rabbit.xsd">

    <rabbit:connection-factory id="connectionFactory" host="127.0.0.1"/>
    <rabbit:admin connection-factory="connectionFactory"/>

    <rabbit:template connection-factory="connectionFactory" id="rabbitTemplate" channel-transacted="true"/>
    <rabbit:queue name="proposalQueue" />

    <rabbit:listener-container connection-factory="connectionFactory">
        <rabbit:listener ref="listener" queue-names="proposalQueue"/>
    </rabbit:listener-container>

    <bean id="rabbitMQTransactionManager" class="org.springframework.amqp.rabbit.transaction.RabbitTransactionManager">
        <property name="connectionFactory" ref="connectionFactory"/>
    </bean>

    <rabbit:direct-exchange name="myExchange">
        <rabbit:bindings>
             <rabbit:binding queue="proposalQueue" key="userMesssage" />
        </rabbit:bindings>
    </rabbit:direct-exchange>
    <bean id="listener" class="com.xxx.xxxx.rabbitmq.QueueServer"/>
 </beans>

QueueServer.java

@Override
    public void onMessage(Message message) 

    Map<String, Object> result = new HashMap<>();       
    MessageProperties props = message.getMessageProperties();
    BasicProperties replyProps = new BasicProperties.Builder().correlationId(new String(message.getMessageProperties().getCorrelationId())).build();
    String inputParameterStr = new String(message.getBody());

        try 
            Map<String,Object> inputParameters  = (Map<String, Object>) Utility.StringToObject(inputParameterStr, "java.util.Map");
            result = service.createQueue(inputParameters);

         catch (ClassNotFoundException e) 
            logger.error("Error :::: "+getClass()+proposalID, e);
            result.put(Constants.FAILURE, e.getMessage());
         catch (Exception e) 
            logger.error("Error :::: "+getClass()+proposalID, e);
            result.put(Constants.FAILURE, e.getMessage());
        
    

请帮忙解决。

【问题讨论】:

【参考方案1】:

java.net.ConnectException:连接被拒绝:连接

这仅仅意味着 RabbitMQ 没有在标准端口 (5672) 上的 localhost (127.0.0.1) 上运行。

您是否下载并安装/运行了 RabbitMQ?它不像 ActiveMQ - 它不能嵌入在 java 应用程序中运行。

【讨论】:

是的。 RabbitMQ (3.5.6) 和 ERLANG (otp_win32_18.1.exe) 安装在 c: 上。 RabbitMQ 服务状态为启动。 好吧,它显然没有监听端口 5672(默认)。在cmd 窗口中尝试netstat -ano | find "5672";如果它真的在听,你应该看到127.0.0.1:5672 ... LISTENING。查看rabbitmq日志,看看有没有信息。 thanks..我在 cmd 上检查过,但没有任何监听端口,如您所说:127.0.0.1:5672 请告诉我生成日志的路径。 Rabbit mq 在 25672 上运行(签入资源监视器。) 我不熟悉Windows上的rabbit;对不起;但您的安装似乎有问题;根据this link,25672 用于集群,所以奇怪的是它正在侦听而不是 5672;您需要找到日志的位置并查看它们。如果一切都失败了;有一个谷歌组 rabbitmq-users 询问有关 rabbitmq 本身的问题(不过,不要在那里问有关 spring-amqp 的问题;这是正确的地方。) 谢谢 Gary.. 我使用您提供的链接重新安装 Rabbitmq。它仍然使用 25672 端口并且错误是相同的。在另一台机器上按照相同的程序进行安装,一切都做得很好..【参考方案2】:

检查主机和端口值

在 application.properties 中

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

查看 RabbitMQ 站点在端口 15672 上运行,而代码中使用 amqp 协议。

【讨论】:

【参考方案3】:

问题还有一个方面

默认情况下,RabbitMQ 只能被本地机器访问。如果你想从其他机器访问它,你通常在“rabbitmq.config”文件中创建一个条目。此文件的位置因操作系统而异。在 Linux 中,您可以在以下位置找到它:“/etc/rabbitmq/rabbitmq.config”,在 Windows 机器中,您可以在以下位置找到它:“C:\Program Files\RabbitMQ Server\ rabbitmq_server-3.6.9\etc\rabbitmq.config”。

您可能在上述位置找不到此文件。这是一个可选文件,即使它丢失,您也不必担心。您可以创建自己的。这个条目是这样的:

[rabbit, [tcp_listeners, ["<IP_OF_MACHINE>", 5672],loopback_users, []]].

有了这个,你可以从任何远程机器访问服务器。

如果在此之后您无法访问服务器,您可以将条目修改为:

[rabbit, [tcp_listeners, ["0.0.0.0", 5672],loopback_users, []]].

您将肯定将服务器连接到任何客户端以及通过管理控制台(如果启用插件)

【讨论】:

【参考方案4】:

为了访问 RabbitMQ 远程,您需要允许端口 4369、25672、5671、5672、15672、61613、61614、1883 和 8883 上的入站 TCP 流量。

sudo firewall-cmd --zone=public --permanent --add-port=4369/tcp --add-port=25672/tcp --add-port=5671-5672/tcp --add-port=15672/tcp  --add-port=61613-61614/tcp --add-port=1883/tcp --add-port=8883/tcp
sudo firewall-cmd --reload

【讨论】:

以上是关于无法连接 Spring AMQP / Rabbit MQ:org.springframework.amqp.AmqpConnectException:java.net.ConnectException的主要内容,如果未能解决你的问题,请参考以下文章

Spring AMQP v1.4.2 - 网络故障时的兔子重新连接问题

如何在 Spring Boot 测试中模拟 Spring amqp/rabbit

Spring AMQP 错误处理策略详解

spring amqp rabbitmq fanout配置

RabbitMQ-Spring AMQP翻译4.1.2——配置基础客户端连接工厂&RabbitConnectionFactoryBean和配置SSL

Spring集成RabbitMQ-连接和消息模板