在Unity中连接RabbitMQ
程序开发
2023-09-11 14:54:39
一、在 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);
}
标签:
上一篇:
angularJS 初始化两个方法处理办法。
下一篇:
相关文章
-
无相关信息