养乐多滋滋滋 2024-05-27 10:27 采纳率: 89.5%
浏览 1
已结题

安卓使用rabbitma的时候,队列可以创建,发送消息的是很好,不能接收


 private void receiveMessage() {
        new Thread(() -> {
            try {
                rabbitMQManager.connect();
                rabbitMQManager.getChannel().basicConsume(RabbitMQManager.QUEUE_NAME, true, (consumerTag, delivery) -> {
                    String message = new String(delivery.getBody(), "UTF-8");
                    mainHandler.post(() -> Toast.makeText(MainActivity.this, "Received: " + message, Toast.LENGTH_SHORT).show());
                    Log.w("rabbitmq接收到的消息为", String.valueOf(mainHandler));
                }, consumerTag -> { });
            } catch (Exception e) {
                e.printStackTrace();
                mainHandler.post(() -> Toast.makeText(MainActivity.this, "Failed to receive message", Toast.LENGTH_SHORT).show());
            }

        }).start();
    }

  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-05-27 10:27
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    根据您提供的代码和描述,我将逐步分析您的receiveMessage()方法,并提供一些可能的解决方案和建议。

    1. rabbitMQManager.connect(); - 确保您的connect()方法正确执行,并且能够成功地连接到RabbitMQ服务器。

    2. rabbitMQManager.getChannel().basicConsume(...) - 您正确地使用了basicConsume方法来接收消息。然而,有几个地方需要注意:

      • RabbitMQManager.QUEUE_NAME - 确保这个常量是正确的,并且与发送消息时使用的队列名称一致。
      • true - 这个参数表示是否自动确认消息。如果您希望手动确认消息,应该将其设置为false,并在接收消息后调用delivery.getEnvelope().acknowledge();
    3. 回调函数 - 您的回调函数看起来是正确的,它将接收到的消息转换为字符串,并在主线程上显示Toast消息。

    4. 异常处理 - 您已经捕获了异常,并在UI线程上显示了一个Toast消息。这是一个很好的实践。

    5. 消息确认 - 如果您设置了自动确认(basicConsume的第二个参数为true),则不需要手动确认消息。如果您希望手动确认,需要在回调函数中添加确认逻辑。

    6. UI线程更新 - 您使用了mainHandler.post()来更新UI,这是正确的。确保mainHandler是正确初始化的Handler实例。

    7. 日志记录 - 在日志记录中,您打印了mainHandler的字符串表示,这可能不是您想要的。如果您想要记录接收到的消息,应该记录message变量。

    可能的问题

    • 确保RabbitMQ服务器正在运行,并且您的应用程序有权限访问它。
    • 检查网络连接,确保应用程序可以与RabbitMQ服务器通信。
    • 如果您更改了队列名称或交换机名称,请确保它们与发送消息时使用的名称一致。
    • 如果您更改了RabbitMQ的配置(如虚拟主机、用户名、密码等),请确保这些配置与您的代码中的配置一致。

    代码示例(如果需要手动确认消息):

    rabbitMQManager.getChannel().basicConsume(RabbitMQManager.QUEUE_NAME, false, (consumerTag, delivery) -> {
        String message = new String(delivery.getBody(), "UTF-8");
        mainHandler.post(() -> Toast.makeText(MainActivity.this, "Received: " + message, Toast.LENGTH_SHORT).show());
        Log.i("Received message", message); // 更改日志记录以显示接收到的消息
        delivery.getEnvelope().acknowledge(); // 手动确认消息
    }, consumerTag -> { });
    

    参考资料

    希望这些信息对您有所帮助!如果问题仍然存在,请提供更多的上下文或错误信息,以便进一步诊断问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月19日
  • 已采纳回答 6月11日
  • 创建了问题 5月27日

悬赏问题

  • ¥15 cfx考虑调整“enforce system memory limit”参数的设置
  • ¥30 航迹分离,航迹增强,误差分析
  • ¥15 Chrome Manifest扩展引用Ajax-hook库拦截请求失败
  • ¥15 用Ros中的Topic通讯方式控制小乌龟的速度,走矩形;编写订阅器代码
  • ¥15 LLM accuracy检测
  • ¥15 pycharm添加远程解释器报错
  • ¥15 如何让子窗口鼠标滚动独立,不要传递消息给主窗口
  • ¥15 如何能达到用ping0.cc检测成这样?如图
  • ¥15 关于#DMA固件#的问题,请各位专家解答!
  • ¥15 请问华为OD岗位的内部职业发展通道都有哪些,以及各个级别晋升的要求