素材巴巴 > 程序开发 >

在Unity中连接RabbitMQ

程序开发 2023-09-11 14:54:39

一、在 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);
 }
 

标签:

素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。