1

我在我的网络应用程序(Asp.net-MVC 4.0)中使用 rabbit-Mq。我的要求是向特定用户发送消息。假设如果 user1 在线并且他通过 rabbit-Mq 向 user2 发送消息。它应该只由“user2”接收。我使用的代码是将消息存储在队列中的模板,每当用户单击接收时,他都会收到该消息,但在我的情况下对特定用户没有限制。任何人都可以收到错误的信息,我必须处理它。请帮助我解决这个问题。

我们在 rabbit-Mq 中有什么东西可以区分正确的用户/消费者的正确消息吗?我们可以设置带有消息的密钥并在接收时检查密钥吗?这可能吗?

下面我正在编写用于发送和接收消息的代码

public ActionResult SendMessage(MessagingModel ObjModel)
        {        var factory = new ConnectionFactory() { HostName = "localhost" };
                using (var connection = factory.CreateConnection())
                {
                    using (var channel = connection.CreateModel())
                    {
                        Message = ObjModel.Message;
                        channel.QueueDeclare("MessageQueue", true, false, false, null);
                        var body = Encoding.UTF8.GetBytes(ObjModel.Message);
   channel.BasicPublish("", "MessageQueue", null, body);
}
}
}

   public JsonResult RecieveMessage()
        {
  var factory = new ConnectionFactory() { HostName = "localhost" };
                using (var connection = factory.CreateConnection())
                {
                    using (var channel = connection.CreateModel())
                    {
                        channel.QueueDeclare("MessageQueue", true, false, false, null);
                        bool noAck = true;
                        BasicGetResult result = channel.BasicGet("MessageQueue", noAck);
                        if (result == null)
                        {
                            Message = "No Messages Found.";
                        }
                        else
                        {
                            IBasicProperties props = result.BasicProperties;
                            byte[] Body = result.Body;
                            Message = Encoding.Default.GetString(Body);
                        }
                    }
                }
4

1 回答 1

1

首先,你必须记住以下几点:

  • RabbitMQ 中的所有消息都通过交换发布。
  • 队列绑定到交换。
  • 如果您将消息直接发布到队列中,实际上它仍然通过默认交换 - (AMPQ默认)。
  • 有不同种类的交换。你可以在这里阅读一些关于交流的信息:https ://www.rabbitmq.com/tutorials/tutorial-three-dotnet.html

在您的情况下,您可能会考虑使用主题或标题交换,但在这种情况下,您应该为每个用户都有一个队列,如果系统中的用户数量很大,那么它将非常占用资源。

您还可以为您的消息添加特定的标题:

var props = model.CreateBasicProperties();
props.Headers.Add("UserId", userId);

然后在RecieveMessage()从队列中读取消息后的方法中查看此标头,如果消息是针对当前用户的 - 接收并确认此消息,否则不确认此消息。
但这是不好的解决方案。我只是将消息从队列保存到数据库,然后按用户过滤读出它们。

于 2014-03-31T08:01:45.960 回答