1. 程式人生 > >MAC OS 安裝rabbitmq+spring boot使用及踩坑 AmqpIOException: java.io.IOException

MAC OS 安裝rabbitmq+spring boot使用及踩坑 AmqpIOException: java.io.IOException

前言

專案中需要使用RabbitMQ的,且需要大量測試,於是初學本機安裝測試使用,簡單記錄,及很蠢的坑。參考了很多部落格,侵刪!

MAC OS上安裝

也可以在mac終端上使用brew安裝:

brew更新

brew安裝rabbitmq

安裝完之後一般位置在:/ usr / local / Cellar / rabbitmq / {version} / 

cd到該目錄,執行sbin / rabbitmq-server啟動

新版一般會自帶啟動部分的外掛,如:

也可自己新增使用者,賦許可權操作

新增使用者:rabbitmqctl add_user使用者名稱密碼

設定許可權:

rabbitmqctl set_permissions [-p vhostpath] username regexp regexp regexp

rabbitmqctl set_user_tags user_admin管理員

vhostpath設定為“/”

設定完之後,可登陸管理介面檢視:

結合彈簧靴使用

只需要行家新增依賴

       <dependency>
            <groupId> org.springframework.boot </ groupId>
            <artifactId> spring-boot-starter-amqp </ artifactId>
        </ dependency>

例如:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.10.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
    </dependencies>

由於是啟動,可以在程式碼中設定RabbitMQ的配置,也可使用配置檔案,開機啟動程式引入配置檔案,如:

@Resource
@ImportResource(locations = {"classpath:rabbitmq-application.xml"})
@RestController
public class ClientApplicationStart {

XML配置:

<?xml version="1.0" encoding="UTF-8"?>
<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"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/rabbit
                           http://www.springframework.org/schema/rabbit/spring-rabbit-1.7.xsd
                           http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                           http://www.springframework.org/schema/util
		                   http://www.springframework.org/schema/util/spring-util-3.0.xsd">

    <!-- rabbit config -->
    <rabbit:connection-factory id="connectionFactory" host="127.0.0.1" port="5672"
                               username="test" password="test" />
    <rabbit:admin connection-factory="connectionFactory" />

    <!-- rabbit provider -->
    <bean id="messageConverter" class="org.springframework.amqp.support.converter.SimpleMessageConverter"/>
    <rabbit:template id="rabbitTemplate" connection-factory="connectionFactory" message-converter="messageConverter" />

   <!-- <rabbit:fanout-exchange id="co.file.fileConverter" name="co.file.fileConverter" />-->



    <rabbit:queue id="testQueue" name="testQueue" auto-delete="false"/>
    <rabbit:fanout-exchange id="testExchange" name="testExchange" >
        <rabbit:bindings>
            <rabbit:binding queue="testQueue"/>
        </rabbit:bindings>
    </rabbit:fanout-exchange>

    <bean id="testListener" class="com.test.listener.TestListener" />

    <rabbit:listener-container connection-factory="connectionFactory" acknowledge="auto" concurrency="1"
                               message-converter="messageConverter">
        <rabbit:listener ref="testListener"  queues="testQueue"/>
    </rabbit:listener-container>
</beans>

本以為一切都ojbk,很簡單,結果啟動就一直報錯

 Failed to check/redeclare auto-delete queue(s).

org.springframework.amqp.AmqpIOException: java.io.IOException
	at org.springframework.amqp.rabbit.support.RabbitExceptionTranslator.convertRabbitAccessException(RabbitExceptionTranslator.java:71) ~[spring-rabbit-1.7.6.RELEASE.jar:na]
	at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:376) ~[spring-rabbit-1.7.6.RELEASE.jar:na]
	at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createConnection(CachingConnectionFactory.java:573) ~[spring-rabbit-1.7.6.RELEASE.jar:na]
	at org.springframework.amqp.rabbit.core.RabbitTemplate.doExecute(RabbitTemplate.java:1436) ~[spring-rabbit-1.7.6.RELEASE.jar:na]
	at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:1417) ~[spring-rabbit-1.7.6.RELEASE.jar:na]
	at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:1393) ~[spring-rabbit-1.7.6.RELEASE.jar:na]
	at org.springframework.amqp.rabbit.core.RabbitAdmin.getQueueProperties(RabbitAdmin.java:336) ~[spring-rabbit-1.7.6.RELEASE.jar:na]
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.redeclareElementsIfNecessary(SimpleMessageListenerContainer.java:1209) ~[spring-rabbit-1.7.6.RELEASE.jar:na]
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1470) [spring-rabbit-1.7.6.RELEASE.jar:na]
	at java.lang.Thread.run(Thread.java:748) [na:1.8.0_172]
Caused by: java.io.IOException: null
	at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:105) ~[amqp-client-4.0.3.jar:4.0.3]
	at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:101) ~[amqp-client-4.0.3.jar:4.0.3]
	at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:353) ~[amqp-client-4.0.3.jar:4.0.3]
	at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:909) ~[amqp-client-4.0.3.jar:4.0.3]
	at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:859) ~[amqp-client-4.0.3.jar:4.0.3]
	at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:1013) ~[amqp-client-4.0.3.jar:4.0.3]
	at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:364) ~[spring-rabbit-1.7.6.RELEASE.jar:na]
	... 8 common frames omitted
Caused by: com.rabbitmq.client.ShutdownSignalException: connection error
	at com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:66) ~[amqp-client-4.0.3.jar:4.0.3]
	at com.rabbitmq.utility.BlockingValueOrException.uninterruptibleGetValue(BlockingValueOrException.java:36) ~[amqp-client-4.0.3.jar:4.0.3]
	at com.rabbitmq.client.impl.AMQChannel$BlockingRpcContinuation.getReply(AMQChannel.java:372) ~[amqp-client-4.0.3.jar:4.0.3]
	at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:297) ~[amqp-client-4.0.3.jar:4.0.3]
	... 12 common frames omitted
Caused by: java.io.EOFException: null
	at java.io.DataInputStream.readUnsignedByte(DataInputStream.java:290) ~[na:1.8.0_172]
	at com.rabbitmq.client.impl.Frame.readFrom(Frame.java:91) ~[amqp-client-4.0.3.jar:4.0.3]
	at com.rabbitmq.client.impl.SocketFrameHandler.readFrame(SocketFrameHandler.java:164) ~[amqp-client-4.0.3.jar:4.0.3]
	at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:571) ~[amqp-client-4.0.3.jar:4.0.3]
	... 1 common frames omitted

無奈各種找原因,網上對這種報錯很多說法,一般為

如圖1所示,網路設定問題,叢集等IP埠對映問題(本地測試,單機IP連線,可忽略)

2,同樣也不是連線拒絕,且telnet檢視IP,埠,沒問題

3,還有使用者許可權不足,同樣也是設定一遍許可權,用客人連線也一樣

4,TCP連線數過多,最終也沒看懂那個帖子在講啥ORZ,單機一個人用,一個連線,也可排除

netstat檢視埠連線情況,也沒啥問題,看報錯又肯定是連線問題

沒辦法,對照主專案之前配置,檢視官網,才發現,崩潰....

官網對RabbitMQ的的配置:

原來,菜鳥的debuff,一開始安裝完之後,就提示使用15672埠登陸管理介面,所以理所當然的認為

<rabbit:connection-factory id="connectionFactory" host="127.0.0.1" port="15672"
                               username="username" password="password" />

此處應該配置為15672,後續都是用該埠檢視連線,佔用情況。

看了官網之後,才知道正確的預設埠為5672(也可修改),15672是管理介面連線所用。果然官網是真理。

改了之後,正常啟動。檢視管理也正常

最後

記錄下坑,而且百度也沒找到跟我一樣犯蠢的,計算器也沒有。多看官網,多看官網,多看官網。

參考:

等很多部落格

如有侵權,立馬刪除

剛剛發現了一位老哥,也是同樣的錯:https://www.oschina.net/question/1762811_2199005