【问题标题】:Cannot connect to RabbitMQ Server from remote machine (Android device)无法从远程机器(Android 设备)连接到 RabbitMQ 服务器
【发布时间】:2016-12-27 00:01:41
【问题描述】:

我已在本地计算机 (Windows 10) 上启动 RabbitMQ 服务器。 localhost:5672 上的管理面板运行良好。我已经建立了新用户,并在 java 中编写了用于发送和接收的示例项目。它适用于 localhost 和我的新建立用户的 IP 地址:

不幸的是我在我的 Android 项目中编写了相同的配置并出现错误

12-27 00:42:04.601 4393-4393/com.gornik.sendsensors E/AndroidRuntime: FATAL EXCEPTION: main
                                                                  Process: com.gornik.sendsensors, PID: 4393
                                                                  android.os.NetworkOnMainThreadException
                                                                      at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
                                                                      at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:110)
                                                                      at libcore.io.IoBridge.connectErrno(IoBridge.java:154)
                                                                      at libcore.io.IoBridge.connect(IoBridge.java:122)
                                                                      at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
                                                                      at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:452)
                                                                      at java.net.Socket.connect(Socket.java:884)
                                                                      at com.rabbitmq.client.impl.FrameHandlerFactory.create(FrameHandlerFactory.java:47)
                                                                      at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:822)
                                                                      at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:778)
                                                                      at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:868)
                                                                      at com.gornik.sendsensors.SendMessages.connectAndPublishMessage(SendMessages.java:27)
                                                                      at com.gornik.sendsensors.MainActivity$1.onClick(MainActivity.java:25)
                                                                      at android.view.View.performClick(View.java:5702)
                                                                      at android.view.View$PerformClick.run(View.java:22541)
                                                                      at android.os.Handler.handleCallback(Handler.java:739)
                                                                      at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                      at android.os.Looper.loop(Looper.java:158)
                                                                      at android.app.ActivityThread.main(ActivityThread.java:7229)
                                                                      at java.lang.reflect.Method.invoke(Native Method)
                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

“connectAndPublishMessage”方法:

public static void connectAndPublishMessage(String serverIPAddress) throws IOException{
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("IP ADDRESS");
    factory.setUsername("NEWUSER");
    factory.setPassword("USERPASSWORD");
    factory.setVirtualHost("/");
    factory.setPort(5672);
    try {
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        String message = "Hello world";
        channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
        Log.d("MESSAGE SENT: ", " [x] Sent '" + message + "'");

        channel.close();
        connection.close();
    }catch(TimeoutException e){
        e.printStackTrace();
    }
}

您能弄清楚为什么在我的本地机器和 Android 设备上会有所不同如何将我的 Android 设备连接到远程 RabbitMQ 服务器?

【问题讨论】:

    标签: android rabbitmq


    【解决方案1】:

    尝试添加这两行:

    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
    

    【讨论】:

      【解决方案2】:

      感谢@Shubham Agarwal 解决问题 :) 为了将来的目的 - 为了确保它正常工作,我必须注意几件事:

      1. 正确配置-ip地址、端口(默认5672)、虚拟主机(“/”)
      2. 新用户作为默认的“guest”只能连接到本地主机
      3. 将 queue.declare() 函数中的布尔参数更改为 true
      4. 添加两行关于线程策略的内容。

      【讨论】:

      • 没问题,您是在谈论队列声明中的持久参数吗?更好地使用交换来发布消息,而不是队列
      • 我的主要目标是编写每 10 毫秒发送一次数据并在桌面应用程序上生成图形的移动应用程序。所以你建议交换而不是排队?
      • 队列和交换选项不会影响您的性能。因为当您将消息发布到队列时,这也是通过默认交换进行的。发布到交易所是未来扩展的更好做法。
      猜你喜欢
      • 1970-01-01
      • 2018-10-12
      • 2018-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多