2013-02-21 173 views
2

我正在從web角色向worker角色發送消息。早些時候,這些消息被正確和立即接收,但現在沒有收到任何消息,即使所有消息的內容都是相同的。就像我現在發送一條消息,它沒有收到,但之後立即如果我發送另一條消息,然後收到最新消息。之前沒有收到的那個,幾秒鐘後突然收到,或者因爲生存時間已過,有時會收到死信。未收到Azure服務總線消息

我無法弄清楚問題是什麼,有什麼想法?或者這種行爲與服務總線正常?

這是怎麼了作業人員的角色接收消息

編輯:

public override void Run() 
    { 
     while (!IsStopped) 
     { 
      try 
      { 
       if (BroadcastReceived) 
       { 
        BroadcastReceived = false; 
        // Receive the message from Web Role to upload the broadcast to queue 
        BroadcastClient.BeginReceive(OnWebRoleMessageReceived, null); 
       } 

       if (SignalRMessageReceived) 
       { 
        SignalRMessageReceived = false; 
        // Receive the message from SignalR BroadcastHub 
        SignalRClient.BeginReceive(OnSignalRMessageReceived, null); 
       } 

       if (SignalRFirstTimeMessageReceived) 
       { 
        SignalRFirstTimeMessageReceived = false; 
        // Receive the message from SignalR BroadcastHub 
        SignalRFirstTimeClient.BeginReceive(OnSignalRFirstTimeMessageReceived, null); 
       }   
     } 
    } 


public void OnWebRoleMessageReceived(IAsyncResult iar) 
    { 
     BrokeredMessage receivedBroadcastMessage = null; 
     receivedBroadcastMessage = BroadcastClient.EndReceive(iar); 

     if (receivedBroadcastMessage != null) 
     { 
      // Process the message 
      receivedBroadcastMessage.Complete(); 
     } 
BroadcastReceived = true; 
    } 

UPDATE:

BroadcastClient = CloudStorageHelper.GetServiceBusQueueClient(Queuenames.ApiToWorkerRole); 

public static QueueClient GetServiceBusQueueClient(string queuename) 
    { 
     string connectionString = CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString"); 

     var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString); 

     if (!namespaceManager.QueueExists(queuename)) 
     { 
      namespaceManager.CreateQueue(queuename); 
     } 

     QueueClient Client = QueueClient.CreateFromConnectionString(connectionString, queuename); 



     return Client; 
    } 

Web角色:

var queueClient = CloudStorageHelper.GetServiceBusQueueClient(Queuenames.ApiToWorkerRole); 

      //for testing purposes 
      record.Username = "owner"; 
      record.Channel = "World"; 
      record.Title = "Sample"; 
      record.Duration = 10; 

      BrokeredMessage message = new BrokeredMessage(record); 

      queueClient.Send(message); 
+0

你可以分享你的電子郵件發送消息的代碼嗎?另外,BroadcastClient如何調用服務總線API? – 2013-02-21 19:45:51

+0

已更新爲您要求的內容。讓我知道如果你發現任何錯誤 – Bitsian 2013-02-22 05:38:11

回答

1

的問題是在我們工作人員的作用,因爲我們出現連續檢查服務總線隊列,以查看是否收到了信息。當我們啓動本地和雲工作者角色時,這兩個角色都嘗試從同一個服務總線隊列接收新消息。因此,有時雲接受它,有時是本地的。

對雲和本地項目使用不同的服務總線隊列名稱解決了問題。

0

在輔助角色以上,喲你只在Run中執行代碼一次。所以基本上,這表明每次運行worker角色時都會處理單個消息?典型的代碼在一個循環來處理消息如下所示:

public override void Run() 
    { 
     while (!IsStopped) 
     { 
      try 
      { 
       // Receive the message 
       BrokeredMessage receivedMessage = null; 
       receivedMessage = Client.Receive(); 

       if (receivedMessage != null) 
       { 
        // Process the message 
        receivedMessage.Complete(); // Unless you do this the message goes back in the Queue 
       } 
      } 
      catch (MessagingException e) 
      { 
       if (!e.IsTransient) 
       { 
        Trace.WriteLine(e.Message); 
        throw; 
       } 

       Thread.Sleep(10000); // optional if you want to add a delay 
      } 
     } 
    } 
+0

對不起,回覆遲!我實際上是從3個不同的服務總線隊列客戶端發送和接收消息!我已更新工作人員角色代碼。每次接收到的消息完成時,都將相應的布爾標誌設置爲true,以便服務總線客戶端再次等待接收消息。如果您發現我的解決方案存在任何問題,請告訴我,因爲我仍然遇到我提到的問題 – Bitsian 2013-03-05 05:21:27

相關問題