2013-12-11 96 views
0

我在我的web應用程序(Asp.net-MVC 4.0)中使用rabbit-mq。我的要求是發送消息給特定的用戶。假設如果user1在線並且他通過rabbit-Mq向user2發送消息。它應該只被「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()方法後,從隊列中讀取消息,看到這個標題,如果消息用於當前用戶 - 接受它,並確認此消息,否則 不確認此消息。
但這是不好的解決方案。我只是將隊列中的消息保存到數據庫中,然後將它們讀出來進行用戶篩選。