flutter中使用rabbitmq

鲤斌發表於2024-07-27

依賴

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;
      });
    });
  }

相關文章