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();
}
根据您的提议我进行了修改,但是rabbitmq格式化界面还是没收到
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
关注 引自免费微信小程序:皆我百晓生
在您提供的代码片段中,看起来您正在尝试从RabbitMQ队列中接收消息,并将消息显示为Toast通知。不过,为了更好地理解问题,我需要更多的上下文信息,例如
rabbitMQManager
类的实现、RabbitMQ服务器的配置以及生产者是如何发送消息的。首先,确保您的RabbitMQ服务器已经正确启动并且可以访问。其次,确认生产者端是否成功地将消息发布到了名为
RabbitMQManager.QUEUE_NAME
的队列中。这里是关于代码的一些建议:
- 确保
rabbitMQManager.connect()
方法连接到正确的RabbitMQ服务器并创建了有效的连接。 - 在
basicConsume
调用中,确保提供的队列名称与生产者发布的队列名称匹配。 - 检查生产者端是否正确设置交换机类型(direct、topic、fanout 或 headers)以及路由键(对于direct和topic类型),这可能影响消息能否被正确路由到队列。
- 考虑使用
get
方法而不是basicConsume
,因为后者是异步的,可能会导致消息丢失,除非您处理了回调中的异常情况。 - 使用
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服务器的配置,以便我能进一步帮助您排查。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录- 确保
悬赏问题
- ¥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语言,单片机