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

根据您的提议我进行了修改,但是rabbitmq格式化界面还是没收到

 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());
            }  // 这一行是为了保持线程运行,否则消费者会立即关闭。
            while (!Thread.currentThread().isInterrupted()) {
                try {
                    Thread.sleep(1000); // 每秒检查一次新消息
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }).start();
    }



  • 写回答

2条回答 默认 最新

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

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

    在您提供的代码片段中,看起来您正在尝试从RabbitMQ队列中接收消息,并将消息显示为Toast通知。不过,为了更好地理解问题,我需要更多的上下文信息,例如rabbitMQManager类的实现、RabbitMQ服务器的配置以及生产者是如何发送消息的。

    首先,确保您的RabbitMQ服务器已经正确启动并且可以访问。其次,确认生产者端是否成功地将消息发布到了名为RabbitMQManager.QUEUE_NAME的队列中。

    这里是关于代码的一些建议:

    1. 确保rabbitMQManager.connect()方法连接到正确的RabbitMQ服务器并创建了有效的连接。
    2. basicConsume调用中,确保提供的队列名称与生产者发布的队列名称匹配。
    3. 检查生产者端是否正确设置交换机类型(direct、topic、fanout 或 headers)以及路由键(对于direct和topic类型),这可能影响消息能否被正确路由到队列。
    4. 考虑使用get方法而不是basicConsume,因为后者是异步的,可能会导致消息丢失,除非您处理了回调中的异常情况。
    5. 使用channel.basicAck()确认消费的消息,这样RabbitMQ知道消息已被处理,不会再次投递给其他消费者。

    基于以上建议,您可以考虑调整代码如下:

    import com.rabbitmq.client.*;
    
    public class RabbitMQConsumer {
    
        private final ConnectionFactory factory;
        private Channel channel;
    
        public RabbitMQConsumer(String host, int port, String virtualHost, String queueName) throws Exception {
            factory = new ConnectionFactory();
            factory.setHost(host);
            factory.setPort(port);
            factory.setVirtualHost(virtualHost);
            connect();
        }
    
        private void connect() throws Exception {
            Connection connection = factory.newConnection();
            channel = connection.createChannel();
            channel.queueDeclare(queueName, true, false, false, null);
        }
    
        public void startConsuming() {
            try {
                DeliverCallback deliverCallback = (consumerTag, delivery) -> {
                    String message = new String(delivery.getBody(), "UTF-8");
                    System.out.println("Received: " + message);
    
                    // 在这里替换为您的UI更新逻辑,比如使用主线程处理
                    // mainHandler.post(() -> Toast.makeText(MainActivity.this, "Received: " + message, Toast.LENGTH_SHORT).show());
                };
    
                channel.basicConsume(queueName, true, deliverCallback, consumerTag -> {});
            } catch (IOException e) {
                e.printStackTrace();
                // 在这里处理错误,可能需要重新连接
            }
        }
    
        public void stopConsuming() throws IOException {
            if (channel != null && channel.isOpen()) {
                channel.close();
            }
        }
    }
    
    // 在MainActivity中使用
    public class MainActivity extends AppCompatActivity {
    
        private RabbitMQConsumer consumer;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            try {
                consumer = new RabbitMQConsumer("localhost", 5672, "/", "my_queue");
                consumer.startConsuming();
            } catch (Exception e) {
                e.printStackTrace();
                Toast.makeText(this, "Failed to start consuming", Toast.LENGTH_SHORT).show();
            }
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
    
            try {
                consumer.stopConsuming();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    这段代码创建了一个简单的RabbitMQ消费者,它会在接收到消息时打印出来。你需要根据实际需求替换主机名、端口号、虚拟主机和队列名称。同时,在onCreate方法中启动消费者,在onDestroy方法中停止消费者。

    如果您仍然遇到问题,请提供更多信息,例如生产者的代码和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语言,单片机