通过rabbitMq发送消息

时间:2013-12-11 11:16:43

标签: c# asp.net asp.net-mvc-4 rabbitmq grails-plugin-rabbitmq

我在我的网络应用程序中使用rabbit-Mq(Asp.net-MVC 4.0)。我的要求是向特定用户发送消息。假设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);
                        }
                    }
                }

1 个答案:

答案 0 :(得分:1)

首先,您必须记住以下事项:

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

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

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

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

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