在VM中部署了一個rabbitMQ server ,在物理機上按照rabbitMQ官網上的 java的教程訪問VM中的rabbitMQ報如下錯誤:
Exception in thread "main" java.net.ConnectException: Connection timed out: connect
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at com.rabbitmq.client.impl.FrameHandlerFactory.create(FrameHandlerFactory.java:32)
at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:714)
at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:760)
at Send.main(Send.java:16)
代碼示例:
import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.client.Connection; import java.util.concurrent.TimeoutException; import com.rabbitmq.client.Channel; public class Send { private final static String QUEUE_NAME = "hello"; public static void main(String[] args) throws java.io.IOException, TimeoutException { ConnectionFactory factory = new ConnectionFactory(); factory.setHost("192.168.198.100"); factory.setPort(5672); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.queueDeclare(QUEUE_NAME, false, false, false, null); String message = "Hello World from Windows!"; channel.basicPublish("", QUEUE_NAME, null, message.getBytes()); System.out.println(" [x] Sent '" + message + "'"); channel.close(); connection.close(); } }
解決方案:
第一步.上面代碼默認是使用rabbitMQ的默認用戶“guest”作為登錄用戶,但是該用戶不用許遠程IP登錄,所以我們需要自己在rabbitMQ中新增一個用戶
//新增admin 密碼admin
rabbitmqctl add_user admin admin
//將admin用戶設置為administrator
rabbitmqctl set_user_tags admin administrator
//給admin所有的權限
rabbitmqctl set_permissions -p / admin".*" ".*" ".*"
然后增加如下Java代碼:
factory.setPassword("test");
factory.setUsername("test");
第二.開啟rabbitMQ的管理UI界面
rabbitmq-plugins enable rabbitmq_management
第三.檢查防火牆是否開啟了5672和15672端口,Centos7如何開啟端口看這里
使用telnet測試
擴展.常見錯誤
1、如果寫錯了host (如:factory.setHost("locathost"); )報錯:
Exception in thread "main" Java.NET.UnknownHostException: locathost at java.Net.PlainSocketImpl.connect(PlainSocketImpl.java:195) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) at java.net.Socket.connect(Socket.java:529) at com.rabbitmq.client.impl.FrameHandlerFactory.create(FrameHandlerFactory.java:32) at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:588) at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:612) at com.aaa.test.Send.main(Send.java:19)
2、如果寫錯端口PORT(如:factory.setPort(5678);) 報錯:
Exception in thread "main" java.net.ConnectException: Connection refused: connect at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351) at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) at java.net.Socket.connect(Socket.java:529) at com.rabbitmq.client.impl.FrameHandlerFactory.create(FrameHandlerFactory.java:32) at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:588) at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:612) at com.aaa.test.Send.main(Send.java:19)
3、如果寫錯用戶名或者密碼,報錯:
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 com.aaa.test.Send.main(Send.java:19)