2012-03-29 17 views
18

一度で紺碧サービスバスキューをクリアします。管理者がキューをクリアすることを選択したときに、すべてのメッセージをキューから削除する機能が必要です。私はネット上で検索が、QueueClientクラス内これを行う任意の関数を見つけることができませんでした。は、我々は我々のプロジェクトでサービスバスキューを使用している

私はすべてのメッセージを一つずつをポップする必要があり、その後、キューをクリアするには、彼らが完全にマーキングやより良い方法はありますか?あなたのようなwhileループ内Receive()メソッドを使用して

QueueClient queueClient = _messagingFactory.CreateQueueClient(
           queueName, ReceiveMode.PeekLock); 

BrokeredMessage brokeredMessage = queueClient.Receive(); 

while (brokeredMessage != null) 
{ 
    brokeredMessage.Complete(); 
    brokeredMessage = queueClient.Receive(); 
} 
+1

私は最近同じ問題に直面していました。削除と再作成はオプションではありませんでしたが、ループは機能しますが、遅いです。しかし、 'QueueClient'の' PrefetchCount'メンバーを使用すると、ラウンドトリップを実行すると、すばらしいことが加速されます。http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.queueclient.prefetchcount.aspx – Necrolis

答えて

8

Receive()方法はキューに表示される別のメッセージを待っされるように、キューが空になると、あなたのコードは、無期限に実行するようになりますされています。

あなたはこれを自動的に実行したい場合は、Peek()方法を使用してみてください。

例えば

:あなたはhochoで述べたようReceiveMode.ReceiveAndDeleteで再びこれを簡単にすることができます

while (queueClient.Peek() != null) 
{ 
    var brokeredMessage = queueClient.Receive(); 
    brokeredMessage.Complete(); 
} 

+1

いくつかの懸念事項:(1)受信しないメッセージは、スケジュールされたメッセージを待ってアプリケーションをハングアップさせます。 (2)各Peekはステータスにかかわらず次のメッセージに移動するので、Completeではなく最初のメッセージを放棄すると、2番目のPeekは2番目のメッセージを取得しますが、2番目のReceiveは1番目のメッセージを再処理します。これにより、Peekは1つのメッセージで受信からオフセットされ、放棄されたメッセージごとにキューの最後に1つのメッセージが未処理のままになります。 –

+0

+1 @JustinJStark新しいメッセージを受信して​​いないキューに対してこのコードをテストすると(処理なし、受信と完了のみ)、キューを完全にクリアできませんでした。それは、メッセージの50-75%だけをクリアしていました。私はキューをクリアするためにこのアプローチを使用しません。 – Justin

2

Azure-ServiceBus-Queuesの場合、n - メッセージの時刻を受け取ることができるReceiveBatch-methodがあります。 ReceiveMode.ReceiveAndDeleteと組み合わせると、キューをより効率的に消去できます。

警告メッセージの数Nが返されるかもしれないが、それは保証されませんです。また、メッセージバッチサイズは256Kという制限があります。 (@ScottBradyと@participantから)

  • どちらのアプローチ
  • そして、あなたはサービスバスキューまたはトピックを/空のメソッドを書くことができMessageReceiver抽象

を:使用

5

購読:

MessageReceiver messageReceiver = ... 
while (messageReceiver.Peek() != null) 
{ 
    // Batch the receive operation 
    var brokeredMessages = messageReceiver.ReceiveBatch(300); 

    // Complete the messages 
    var completeTasks = brokeredMessages.Select(m => Task.Run(() => m.Complete())).ToArray(); 

    // Wait for the tasks to complete. 
    Task.WaitAll(completeTasks); 
} 
1

Azure Servをクリーニングする最速の方法iceBusキューは、非常に短いDefaultMessageTimeToLiveを設定し、数秒待って、その後、初期DefaultMessageTimeToLiveを復元更新する力からキューからそれを受け取る試してみることです。

ポータルからまたはコードからそれを行うことができます:あなたはnugetからWindowsAzure.Storageライブラリを使用している場合は、キュー全体をクリアするための簡単な方法Clear()あり

var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString); 
var queueDescription = _namespaceManager.GetQueue(queueName); 
var queueClient = QueueClient.CreateFromConnectionString(connectionString, queueName, ReceiveMode.ReceiveAndDelete); 

var dl = queueDescription.EnableDeadLetteringOnMessageExpiration; 
var ttl = queueDescription.DefaultMessageTimeToLive; 

queueDescription.EnableDeadLetteringOnMessageExpiration = false; 
queueDescription.DefaultMessageTimeToLive = TimeSpan.FromSeconds(1); 

Thread.Sleep(5000); 
var dumy = queueClient.ReceiveBatch(200, TimeSpan.FromSeconds(1)).ToArray(); 

queueDescription.EnableDeadLetteringOnMessageExpiration = dl; 
queueDescription.DefaultMessageTimeToLive = ttl; 
+0

Hi Florent、apiが変更されたかどうかはわかりませんが、私は自分のキューでこれを試しましたが、変更はありませんでした。前後のキューに同じメッセージがあります。 –

0

。私は、キューを管理するために、そのライブラリからMicrosoft.Windows.Azure.Queueクラスを使用します。それ以外の場合は、API per their documentationでアクセスできます。 Azureライブラリにどのくらいの時間がかかっていたのか分かりません。最初に質問されたときには存在しなかったかもしれませんが、REST APIは少なくとも2014年に戻ってきました。this Azure feedback post

AzureのライブラリとキューをクリアするNETのコードは次のとおりです。

string connectionString = "YourAzureConnectionStringHere"; 
string queueName = "YourWebJobQueueName"; 
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString); 

// Create the queue client, then get a reference to queue 
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient(); 
queue = queueClient.GetQueueReference(GetQueueName(queueName)); 

// Clear the entire queue 
queue.Clear(); 
0

は私がReceiveAndDeletePrefetchCountReceiveBatchAsyncの組み合わせ、およびシンプルな真実ループを使用して良い結果を持つのではなくかいま見を使用しています。以下MessagingFactoryと例:

var receiverFactory = MessagingFactory.CreateFromConnectionString("ConnString"); 
var receiver = receiverFactory.CreateMessageReceiver("QName", ReceiveMode.ReceiveAndDelete); 
receiver.PrefetchCount = 300; 

bool loop = true; 
while (loop) 
{ 
    var messages = await receiver.ReceiveBatchAsync(300, TimeSpan.FromSeconds(1)); 
    loop = messages.Any(); 
} 

のみWindowsAzure.ServiceBus Nugetパッケージが必要です。