2013-12-11 2 views
0

Я использую rabbit-Mq в своем веб-приложении (Asp.net-MVC 4.0). Мое требование - отправить сообщение конкретному пользователю. Предположим, что user1 находится в сети, и он отправляет сообщение пользователю2 кроликом-мк. Он должен быть получен только «user2». Код, который я использовал, - это шаблон, который хранит сообщение в очереди, и всякий раз, когда пользователь нажимает на него, он получит это сообщение, но в моем случае нет ограничений для конкретного пользователя. Любой может получить это сообщение, которое является неправильным, и я должен это обработать. Пожалуйста, помогите мне в этом.Отправка сообщений rabbitMq

Есть ли у нас что-то в 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

Во-первых, вы должны помнить следующие вещи:

  • Все сообщения в RabbitMQ опубликованных через обмен.
  • Очереди, привязанные к биржам.
  • Событие, если вы публикуете сообщение непосредственно в очередь, на самом деле оно по-прежнему проходит через обмен по умолчанию - (AMPQ по умолчанию).
  • Существуют различные виды обмена. Вы можете прочитать немного об обмене здесь: https://www.rabbitmq.com/tutorials/tutorial-three-dotnet.html

В вас случае, если вы могли бы рассмотреть Используйте тему или заголовки обменов, но в этом случае вы должны для каждого пользователя есть очереди, и если число пользователи в системе большие, тогда он будет очень ресурсоемким.

Также вы можете добавить конкретный заголовок к вам сообщение:

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

, а затем в RecieveMessage() метод после того, как прочитал сообщение из очереди увидеть этот заголовок, и если сообщение, предназначенное для текущего пользователя - получить его и подтвердить это сообщение, в противном случае не принимаем это сообщение.
Но это плохое решение. Я бы просто сохранил сообщения из очереди в базу данных, а затем прочитал их фильтрацию пользователем.