2016-11-11 4 views
0

公式ドキュメントに記載されているAzure Service Busサンプルを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)を使用して古いサブスクリプションを削除します。

関連する問題