依赖

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

 

posted on 2024-07-27 20:34  鲤斌  阅读(28)  评论(0编辑  收藏  举报