今天在開發 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 "/" ...
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
▼覺得本站資訊不錯,請不吝給個讚,感謝您▼
然後 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