一、在 Linux 中安装 RabbitMQ
- 使用Docker安装:
docker pull rabbitmq
- 启动容器:
RabbitMQ基于 “节点名” 来存储数据,默认为主机名。这意味着在Docker中,我们应该为每个守护进程显式指定 --hostname,这样我们就不会得到一个随机的主机名,并且可以跟踪我们的数据:
15672是Web管理界面的端口;5672是RabbitMQ的访问端口
docker run -d --hostname my-rabbit -p 15672:15672 -p 5672:5672 --name rabbit rabbitmq
- 进入容器:
docker exec -it rabbit /bin/bash
- 开启 management,这样才能在浏览器中使用
localhost:15672登录管理界面:
rabbitmq-plugins enable rabbitmq_management
二、在 Unity 安装 RabbitMQ.Client
网上大多数方法都推荐使用NuGet,但是如果直接使用VS中提供的NuGet下载RabbitMQ.Client的话,虽然项目内没报错,但Unity中会提示缺少依赖包。所以使用 NuGetForUnity,它会自动在Packages文件夹下导入相关包的.dll文件。
- 下载 NuGetForUnity,导入Unity
- 使用 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);
}
本文介绍了如何在Linux环境中使用Docker安装并配置RabbitMQ,强调了设置hostname的重要性。然后讲解了在Unity中如何利用NuGetForUnity规避依赖问题来安装RabbitMQ.Client。最后,提供了生产者和消费者的基本代码示例,展示了如何进行消息的发送与接收。
337

被折叠的 条评论
为什么被折叠?



