2015年8月13日 星期四

RabbitMQ setHost的ip之後 client 無法與 server 連線問題

RabbitMQ setHost的ip之後 client 無法與 server 連線問題 (localhost却可以)

 


今天在開發 RabbitMQ 的 client 程式時發現只要是設定server 的 ip 就無法連線但是用 localhost 就可以連線,狀況是 client 端的程式想要連結到這個 RabbitMQ 去 Send 資料或是要去MQ Receive 資料的時後會出問題錯誤訊息如下面紅色小字,觀察的結果是程式中的 factory.setHost("localhost") 就可以正常連線存取 queue,但是若是將 factory.setHost("10.64.1.1"); 類似這樣的IP方式指定就跑不起來,錯誤訊息如下,不過我的 client 程式一定和 mqserver 不在同一台機器上,所以這個問題一定要被解決的。




 


Exception in thread "main" com.rabbitmq.client.AuthenticationFailureException: ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broker logfile.


at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:338)


at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:590)


at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:612)


at Send.main(Send.java:17)


 


 


爬文了半天才知道原因就是預設連線的時後不設定 connect 的 user 時預設是會採用 guest/guest 這組帳密 ,若是你將localhost改成某個ip 位址時,這時後你就必需要指定這個 RabbitMQ 的存取帳密 (因為 guest 只能連結localhost無法連結ip),因此你的client 程式端必需要作下列的設定來指出user name , pass word , host ip and host port ,有了這些資訊之後你的 RabbitMQ Client 才有正確的連結到 rabbitmqserver。


 






 


問題很好解決,不過也爬文爬了三個多小時才找到解決方法,一開始是想要透過rabbitmq-env.conf去指定rabbitmq.config中設定新增user ,讓 client 端程式可以使用新的一組帳密而不透過 default 的 guest/guest 來連接 server (這組預設帳號只能連localhost,不能指定 ip),不過在加設定的那一段 config file 一直出問題,所以我就改另外一個網路找到的方式,透過sudo rabbitmqctl add_user 指令來新增 rabbitmq 的新使用者,這樣子就可以在client 程式中指定用這個新建立的使用者並可以用ip的方式來設定 factory.setHost("10.64.1.1"),經測試新增 user 並修改 client code 之後成功可以連線存取 rabbitmq。


 


新增 RabbitMQ user test/test ,並且把 test 加入管理員權限


sudo rabbitmqctl add_user test test


sudo rabbitmqctl set_user_tags test administrator


sudo rabbitmqctl set_permissions -p / test ".*" ".*" ".*"


 


meson@meson-VirtualBox:/etc/rabbitmq$ sudo rabbitmqctl add_user test test


Creating user "test" ...


 


meson@meson-VirtualBox:/etc/rabbitmq$ sudo rabbitmqctl set_user_tags test administrator


Setting tags for user "test" to [administrator] ...


 


meson@meson-VirtualBox:/etc/rabbitmq$ sudo rabbitmqctl set_permissions -p / test ".*" ".*" ".*"


Setting permissions for user "test" in vhost "/" ...







▼覺得本站資訊不錯,請不吝給個讚,感謝您▼


 



 



然後 client 端的程式,直接像下列的方式指定用 test/test 來連結 rabbitmq 終於成功了!


factory.setUsername("test"); //Default username


factory.setPassword("test"); //Default password


factory.setVirtualHost("/"); // set the virtual host


factory.setHost("10.57.46.1"); //set the IP Address


factory.setPort(5672); //Default Port


張貼留言