React Native使用RabbitMQ:已连服务器,求消息接收完整示例
React Native中用react-native-rabbitmq接收RabbitMQ消息的实战方案
嘿,我前阵子刚在React Native里折腾完RabbitMQ的消息接收,和你的情况几乎一模一样——先是搞定了模拟器和服务器的连接,能看到消息乖乖进队列,但就是卡在接收这一步。后来对着react-native-rabbitmq的文档反复试,终于跑通了,给你分享下我的实操经验:
第一步:先确认基础配置没问题
你已经能看到消息进队列,说明连接和队列声明的基础逻辑是对的,但还是贴一下我这边的初始化代码方便你对照:
import { RabbitMQ } from 'react-native-rabbitmq'; // 你的RabbitMQ服务器配置,根据实际情况修改 const rabbitConfig = { host: '你的服务器IP/域名', port: 5672, username: '你的用户名', password: '你的密码', virtualhost: '/', ssl: false // 如果服务器开启了SSL就设为true }; let rabbitConnection; let rabbitChannel; let targetQueue; // 初始化连接和信道 const initRabbitMQ = async () => { try { rabbitConnection = await RabbitMQ.createConnection(rabbitConfig); await rabbitConnection.connect(); // 创建信道,RabbitMQ的核心操作基本都在信道上完成 rabbitChannel = await rabbitConnection.createChannel(); // 声明队列,要和你发送消息的队列名完全一致! targetQueue = await rabbitChannel.assertQueue('test_queue', { durable: true }); // 连接成功后再设置消息监听 startListeningMessages(); } catch (err) { console.error('RabbitMQ初始化出错:', err); } };
第二步:正确实现消息接收逻辑
你提到的queue.on('message', ...)是核心,但光写这个还不够,得先让信道去消费队列的消息,不然RabbitMQ不会把消息推给你的App。给你贴完整的监听代码:
const startListeningMessages = () => { // 关键步骤:调用channel.consume告诉RabbitMQ要消费这个队列的消息 rabbitChannel.consume(targetQueue.queue, (receivedMsg) => { if (receivedMsg) { // 消息内容默认是Buffer类型,先转成字符串,要是你发的是JSON格式就再转成对象 const msgContent = JSON.parse(receivedMsg.content.toString()); console.log('终于收到消息啦:', msgContent); // 要是你设置了autoAck: false,记得手动确认消息,不然RabbitMQ会一直保留这条消息 // rabbitChannel.ack(receivedMsg); } }, { autoAck: true }); // 你提到的queue.on事件也能用来监听消息,和上面的consume回调效果类似 targetQueue.on('message', (msgData) => { const parsedData = JSON.parse(msgData.content.toString()); console.log('通过queue事件收到消息:', parsedData); }); };
几个踩过的坑给你提个醒
- 模拟器里别用
localhost当服务器地址,要用你电脑的局域网IP,不然会出现连接失败的情况 - 队列名称一定要和发送端完全一致,大小写都不能错!我之前就是因为大小写差了一点,折腾了好半天
- 可以去RabbitMQ的management页面看看队列的「Consumers」数量,如果是0,说明你的App没成功注册成消费者,得检查初始化代码有没有报错
- 记得处理连接断开的情况,监听
rabbitConnection.on('close', ...)和rabbitConnection.on('error', ...)事件,加个重连逻辑会让整个服务更稳定
内容的提问来源于stack exchange,提问作者orhan fidan
相关产品推荐
相关产品推荐

