在Unity中连接RabbitMQ

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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部