养乐多滋滋滋 2024-05-27 09:37 采纳率: 94.4%
浏览 1
已结题

安卓使用rabbitmq,可视乎界面收不到消息,但是队列创建成功

安卓使用rabbitmq,为什么队列都在格式化界面显示了,但是查不到消息,并且messags这一列都是0?以下是代码和效果图
效果图:

img

img

代码:

MainActivity
package com.jl.rabbitmq;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.widget.Toast;


public class MainActivity extends AppCompatActivity {

    private RabbitMQManager rabbitMQManager;
    private Handler mainHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        rabbitMQManager = new RabbitMQManager();
        mainHandler = new Handler(Looper.getMainLooper());

        // 发送消息
        sendMessage("hello_Test");
        receiveMessage();
    }

    private void sendMessage(String message) {
        new Thread(() -> {
            try {
                rabbitMQManager.connect();
                rabbitMQManager.sendMessage(message);
                rabbitMQManager.close();
                mainHandler.post(() -> Toast.makeText(MainActivity.this, "Message sent!", Toast.LENGTH_SHORT).show());
            } catch (Exception e) {
                e.printStackTrace();
                mainHandler.post(() -> Toast.makeText(MainActivity.this, "Failed to send message", Toast.LENGTH_SHORT).show());
            }
        }).start();
    }

    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());
                }, consumerTag -> { });
            } catch (Exception e) {
                e.printStackTrace();
                mainHandler.post(() -> Toast.makeText(MainActivity.this, "Failed to receive message", Toast.LENGTH_SHORT).show());
            }
        }).start();
    }


}

RabbitMQManager
package com.jl.rabbitmq;

import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Channel;
/**
 * 功能:
 * 作者:Jin
 * 日期:2024年05月17日
 */
public class RabbitMQManager {
    public final static String QUEUE_NAME = "Test";
    public ConnectionFactory factory;
    public Connection connection;
    public Channel channel;

    public RabbitMQManager() {
        factory = new ConnectionFactory();
        factory.setHost("113.31.105.59");
        factory.setUsername("admin");
        factory.setPassword("密码我就不提供了");

//        factory.setHost("127.0.0.1");
//        factory.setUsername("guest");
//        factory.setPassword("guest");
    }

    public void connect() throws Exception {
        connection = factory.newConnection();
        channel = connection.createChannel();
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
    }

    public void sendMessage(String message) throws Exception {
        channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
    }

    public void close() throws Exception {
        channel.close();
        connection.close();
    }

    public Channel getChannel() {
        return channel;
    }
}
  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-27 09:38
    关注

    引自免费微信小程序:皆我百晓生

    根据您提供的信息,看起来您的Android应用与RabbitMQ服务器之间的通信没有问题,因为您已经正确地创建了队列并能看到它们在管理界面中。然而,消息并没有被收到,这可能是因为消费端的配置不正确或者是发送端的问题。

    首先,确保您的Android设备可以访问到RabbitMQ服务器(IP地址是正确的并且网络配置允许连接)。然后,让我们检查一下RabbitMQ Manager类中的receiveMessage方法,看看是否有潜在问题。在这个方法里,您创建了一个消费者,但没有设置一个回调函数来处理接收到的消息。我们需要添加一个适当的回调函数来接收消息。

    这里是修改后的receiveMessage方法:

    private void receiveMessage() {
        new Thread(() -> {
            try {
                rabbitMQManager.connect();
                channel = rabbitMQManager.getChannel();
    
                DeliverCallback deliverCallback = (consumerTag, delivery) -> {
                    String message = new String(delivery.getBody(), "UTF-8");
                    Log.d("RabbitMQReceiver", "Received: " + message);
                    mainHandler.post(() -> Toast.makeText(MainActivity.this, "Received: " + message, Toast.LENGTH_SHORT).show());
                };
    
                channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {});
    
                // 这一行是为了保持线程运行,否则消费者会立即关闭。
                while (!Thread.currentThread().isInterrupted()) {
                    Thread.sleep(1000); // 每秒检查一次新消息
                }
            } catch (Exception e) {
                e.printStackTrace();
                mainHandler.post(() -> Toast.makeText(MainActivity.this, "Failed to receive message", Toast.LENGTH_SHORT).show());
            } finally {
                try {
                    if (channel != null && channel.isOpen()) {
                        channel.close();
                    }
                    if (connection != null && connection.isOpen()) {
                        connection.close();
                    }
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        }).start();
    }
    

    这个改动包括:

    1. 添加了一个名为deliverCallback的匿名内部类,它实现了DeliverCallback接口。当有新的消息到达时,这个回调函数会被调用。
    2. basicConsume方法中使用了这个回调函数,这样当消息到达时,就可以处理这些消息了。
    3. 使用了一个无限循环while (!Thread.currentThread().isInterrupted())来保持线程运行,这样消费者就会持续监听新的消息。当然,在实际生产环境中,你需要考虑如何优雅地停止这个线程。

    现在,当您发送消息时,应该可以在Android应用中看到相应的提示。如果仍然有问题,请检查一下消息是否真的从其他地方发送到了RabbitMQ服务器,以及消息的编码是否正确。此外,确保RabbitMQ服务器的日志中没有关于错误或警告的信息。

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

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 爬虫抓取数据|解析视频文本内容(相关搜索:自动化)
  • ¥15 combobox绑定值改变的问题
  • ¥15 from seleniumwire import webdriver 在抓取http://链接的时候会自动转https://这个怎么解决
  • ¥15 hive直连数据库模式插入mysql表数据失败(相关搜索:数据库)
  • ¥30 不会,学习,有偿解答
  • ¥15 SQL查询语句报错(检查)
  • ¥15 此表中公式应该怎么写
  • ¥15 求HI-TECH PICC 9.50 PL3安装包
  • ¥15 下载ctorch报错,求解
  • ¥15 如何入门学习c语言,单片机