在Unity中连接RabbitMQ

本文介绍了如何在Linux环境中使用Docker安装并配置RabbitMQ,强调了设置hostname的重要性。然后讲解了在Unity中如何利用NuGetForUnity规避依赖问题来安装RabbitMQ.Client。最后,提供了生产者和消费者的基本代码示例,展示了如何进行消息的发送与接收。

一、在 Linux 中安装 RabbitMQ

  1. 使用Docker安装:
docker pull rabbitmq 
  1. 启动容器:

RabbitMQ基于 “节点名” 来存储数据,默认为主机名。这意味着在Docker中,我们应该为每个守护进程显式指定 --hostname,这样我们就不会得到一个随机的主机名,并且可以跟踪我们的数据:

15672是Web管理界面的端口;5672是RabbitMQ的访问端口

docker run -d --hostname my-rabbit -p 15672:15672 -p 5672:5672 --name rabbit rabbitmq
  1. 进入容器:
docker exec -it rabbit /bin/bash
  1. 开启 management,这样才能在浏览器中使用 localhost:15672 登录管理界面:
rabbitmq-plugins enable rabbitmq_management

二、在 Unity 安装 RabbitMQ.Client

网上大多数方法都推荐使用NuGet,但是如果直接使用VS中提供的NuGet下载RabbitMQ.Client的话,虽然项目内没报错,但Unity中会提示缺少依赖包。所以使用 NuGetForUnity,它会自动在Packages文件夹下导入相关包的.dll文件。

  1. 下载 NuGetForUnity,导入Unity
  2. 使用 NuGet 安装RabbitMQ.Client,会自动安装依赖库

三、连接RabbitMQ

生产者与消费者的简单示例,具体见官方教程:RabbitMQ Tutorials

// 生产者
public void Producer(string queueName, string message)  
{  
    // 创建连接工厂  
    var factory = new ConnectionFactory  
    {  
        HostName = "192.168.1.167",  
        UserName = "guest", // 默认用户名  
        Password = "guest", // 默认密码  
        Port = 5672, // 默认端口  
        VirtualHost = "/" // 默认虚拟机  
    };  

    // 获取TCP长链接
    using (var connection = factory.CreateConnection())  
    {  
        // 创建通道  
        using (var channel = connection.CreateModel())  
        {  
            // 声明队列  
            channel.QueueDeclare(queue: queueName, durable: true, exclusive: false, autoDelete: false, arguments: null);
            // 将消息转换成字节数组
            var body = Encoding.UTF8.GetBytes(message);
            // 发送消息到队列
            channel.BasicPublish(exchange: "",routingKey: queueName, basicProperties: null,body: body);
        }  
    }  
}

// 消费者
public void Consumer(string queueName)  
{  
    var factory = new ConnectionFactory  
    {  
        HostName = "192.168.1.167",  
        UserName = "guest",  
        Password = "guest",  
        Port = 5672,  
        VirtualHost = "/"  
    };  
  
    // 建立连接和通道  
    // 消费者持续运行以侦听消息,不使用 using 来释放资源  
    var connection = factory.CreateConnection();  
    var channel = connection.CreateModel();  

    //由于消费者可能先于生产者启动,所以消费者也需要声明队列  
    channel.QueueDeclare(queueName, true, false, false, null);  

    // 创建消费者  
    EventingBasicConsumer consumer = new EventingBasicConsumer(channel);  

    // 接收到消息后的处理方法
    consumer.Received += (model, eventArgs) =>  
    {  
        // 获取消息  
        var body = eventArgs.Body.ToArray();  
        var message = Encoding.UTF8.GetString(body);  
        // 处理消息  
        Debug.Log($"Received message: {message}");  
        // 消息确认
        channel.BasicAck(eventArgs.DeliveryTag, false);  
    };
    
    // 消费者开启监听,从队列中获取消息  
    // 为了确保消息不会丢失,RabbitMQ支持消息应答。消费者发回一个ack(确认),告诉RabbitMQ一个特定的消息已经被接收、处理,RabbitMQ可以自由删除它。
    channel.BasicConsume(queue: queueName, autoAck: false, consumer: consumer);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值