依賴
dart_amqp: ^0.3.1 #rabbitMq接收傳送訊息
工具封裝
import 'package:dart_amqp/dart_amqp.dart'; /// 封裝 RabbitMQ 的服務類 class RabbitMQService { late ConnectionSettings _settings; // RabbitMQ 連線設定 late Client _client; // RabbitMQ 客戶端 late Channel _channel; // RabbitMQ 通道 /// 初始化 RabbitMQ 客戶端 /// [host] 主機地址 /// [port] 埠號 /// [username] 使用者名稱 /// [password] 密碼 Future<void> initialize({ required String host, required int port, required String username, required String password, }) async { print('初始化RabbitMQ客戶端…'); _settings = ConnectionSettings( host: host, port: port, authProvider: PlainAuthenticator(username, password), ); _client = Client(settings: _settings); print('連線RabbitMQ…'); try { _channel = await _client.channel(); print('通道建立成功。'); } catch (e) { print('建立通道失敗:: $e'); rethrow; } } /// 傳送訊息到指定的交換機 /// [exchange] 交換機名稱 /// [routingKey] 路由鍵 /// [message] 要傳送的訊息內容 Future<void> publishMessage( String exchange, String routingKey, String message) async { // 獲取指定的交換機 final exchangeInstance = await _channel.exchange(exchange, ExchangeType.DIRECT); // 傳送訊息到交換機 exchangeInstance.publish(message, routingKey); } /// 直接傳送訊息到指定佇列 /// [queueName] 佇列名稱 /// [message] 要傳送的訊息內容 Future<void> publishMessageToQueue(String queueName, String message) async { // 獲取指定的佇列 final queue = await _channel.queue(queueName, durable: true); // 傳送訊息到佇列 queue.publish(message); } /// 從指定佇列中消費訊息 /// [queueName] 佇列名稱 /// [onMessage] 訊息處理回撥函式 Future<void> consumeMessages( String queueName, void Function(AmqpMessage) onMessage) async { // 獲取指定的佇列 final queue = await _channel.queue(queueName, durable: true); // 消費佇列中的訊息 final consumer = await queue.consume(); // 監聽佇列中的訊息 consumer.listen((AmqpMessage message) async { print('監聽佇列中的訊息: $message'); try { // 處理訊息 onMessage(message); // 確認訊息已處理 // message.ack(); //rabbitmq自動確定 可以不加 } catch (e) { print('處理訊息時出錯: $e'); // 確保在處理失敗時記錄異常 } }); } /// 關閉 RabbitMQ 連線和通道 Future<void> close() async { // 關閉通道 await _channel.close(); // 關閉客戶端 await _client.close(); } }
使用
//建立通道 init() async { await rabbitMQService.initialize( host: '39.13.110', // 替換為你的 RabbitMQ 主機地址 port: 5672, // 預設 RabbitMQ 埠號 username: 'ain', // 替換為你的 RabbitMQ 使用者名稱 password: 'hachjhb', // 替換為你的 RabbitMQ 密碼 ); } await rabbitMQService.publishMessageToQueue( "佇列", //佇列的名稱 'Hello RabbitMQ! 峰的 $a' // 要傳送的訊息內容 ); Future<void> xiaofei() async { // 訂閱訊息,從指定佇列中獲取訊息 await rabbitMQService.consumeMessages('佇列', (AmqpMessage message) { // 列印收到的訊息內容 print('到的訊息內容: ${message.payloadAsString}'); setState(() { word = message.payloadAsString; }); }); }