1

Windows Azure Toolkit for Windows 8 を使用している WinRT アプリがあります。クライアントが発信者である場合、またはメッセージがサブスクリプションの開始時よりも古い場合に、ServiceBus トピックに投稿されたメッセージを無視するようにクライアントにサブスクライブしてもらいたいという設定があります。

BrokeredMessage のプロパティで、これらのシナリオをカバーするために 2 つの項目を追加しました。

message.Properties["Timestamp"] = DateTime.UtcNow.ToFileTime();
message.Properties["OriginatorId"] = clientId.ToString();

clientId は Guid です。

サブスクライバー側は次のようになります。

// ti is a class that contains a Topic, Subscription and a bool as a cancel flag.

string FilterName = "NotMineNewOnly";

// Find or create the topic.
if (await Topic.ExistsAsync(DocumentId.ToString(), TokenProvider))
{
    ti.Topic = await Topic.GetAsync(DocumentId.ToString(), TokenProvider);
}
else
{
    ti.Topic = await Topic.CreateAsync(DocumentId.ToString(), TokenProvider);
}

// Find or create this client's subscription to the board.
if (await ti.Topic.Subscriptions.ExistsAsync(ClientSettings.Id.ToString()))
{
    ti.Subscription = await ti.Topic.Subscriptions.GetAsync(ClientSettings.Id.ToString());
}
else
{
    ti.Subscription = await ti.Topic.Subscriptions.AddAsync(ClientSettings.Id.ToString());
}

// Find or create the subscription filter.
if (!await ti.Subscription.Rules.ExistsAsync(FilterName))
{
    // Want to ignore messages generated by this client and ignore any that are older than Timestamp.
    await ti.Subscription.Rules.AddAsync(FilterName, sqlFilterExpression: string.Format("(OriginatorId != '{0}') AND (Timestamp > {1})", ClientSettings.Id, DateTime.UtcNow.ToFileTime()));
}

ti.CancelFlag = false;

Topics[boardId] = ti;

while (!ti.CancelFlag)
{
    BrokeredMessage message = await ti.Subscription.ReceiveAndDeleteAsync(TimeSpan.FromSeconds(30));

    if (!ti.CancelFlag && message != null)
    {
        // Everything gets here!  :(
    }

私はすべてを取り戻したので、何が間違っているのかわかりません。サブスクリプション フィルターの問題をトラブルシューティングする最も簡単な方法は何ですか?

4

2 に答える 2

14

サブスクリプションを作成すると、デフォルトで「MatchAll」フィルターが取得されます。上記のコードでは、フィルターを追加しているだけなので、「MatchAll」フィルターに加えて適用され、すべてのメッセージが受信されます。サブスクリプションが作成されたら $Default フィルターを削除するだけで、問題が解決するはずです。

于 2012-07-25T22:09:03.393 に答える
1

トラブルシューティングの最善の方法は、Paolo Salvatori の Service Bus Explorer を使用することです http://code.msdn.microsoft.com/windowsazure/Service-Bus-Explorer-f2abca5a

彼はそれについてかなりの数のブログ投稿を行っています。

Windows Azure SDK 1.7 には機能が組み込まれていますが、Service Bus Explorer スタンドアロン バージョンの方が優れています。比較はこちらを参照してください。

http://soa-thoughts.blogspot.com.au/2012/06/visual-studio-service-bus-explorer.html

HTH あなたのデバッグ...

于 2012-07-25T06:21:32.327 に答える