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