2016-11-11 33 views
0

我試圖運行其官方文檔中提供的Azure服務總線示例https://azure.microsoft.com/en-gb/documentation/articles/service-bus-dotnet-how-to-use-topics-subscriptions/Azure服務總線 - SQLFilter無法按預期方式工作

創建預訂

namespaceManager.CreateSubscription(TopicName, "CreatedMessages", new SqlFilter(@"Type = 'Created'")); 

發送消息

public void SendMessages() 
{ 
    var client = TopicClient.CreateFromConnectionString(_connectionString, TopicName); 

    for (var i = 0; i < 5; i++) 
    { 
     var message = new BrokeredMessage("TestMessage " + i); 

     if (i%2 == 0) 
      message.Properties["Type"] = "Created"; 
     else 
      message.Properties["Type"] = "All"; 

     client.Send(message); 
    } 
} 

處理信息

public void ListenMessages() 
    { 
     Task.Factory.StartNew(() => SubscribeMessages("CreatedMessages")); 
    } 

    public void SubscribeMessages(string subscription) 
    { 
     var allMessagesClient = SubscriptionClient.CreateFromConnectionString(_connectionString, TopicName, subscription); 

     allMessagesClient.OnMessage(message => 
     { 
      try 
      { 
       Console.WriteLine($"** {subscription} **"); 
       Console.WriteLine("Body: " + message.GetBody<string>()); 
       Console.WriteLine("MessageID: " + message.MessageId); 
       Console.WriteLine("Message Type: " + message.Properties["Type"]); 
       Console.WriteLine(); 

       message.Complete(); 
      } 
      catch (Exception) 
      { 
       message.Abandon(); 
      } 
     }, 
     new OnMessageOptions 
     { 
      AutoComplete = false, 
      AutoRenewTimeout = TimeSpan.FromMinutes(1) 
     }); 
    } 

上面的代碼按預期工作。

但是,面臨的問題是,'Type'屬性被重命名爲'MessageType'或'Name'之類的任何內容時,SQLFilter會停止工作,並且我不會再收到任何消息。

我在做什麼錯?

+0

難道是舊的「基於類型」和新的過濾器相互衝突?請記住,過濾器是持久的。 –

回答

1

這是一個預期的行爲。您創建的主題(CreatedMessages)會使用過濾器創建一次並按原樣保存。即它是靜態的。無論您何時決定過濾器需要更改,都應該更新您的訂閱以擁有新的過濾器。

要使用新過濾器更新現有訂閱,您可以查看NamespaceManager.GetRulesAsync(string, string)以獲取訂閱的現有規則,然後使用SubscriptionClient.RemoveRuleAsync(String)刪除舊訂閱。

相關問題