Azure Service Bus-Warteschlange PeekBatch-Sperre?

8

Ich verwende die PeekBatch(<messageCount>) -Methode für QueueClient (Windows Azure Service Bus-Paketversion 2.1.2.0).

Es funktioniert beim ersten Mal einwandfrei und gibt meine einzelne Nachricht zurück, die in meiner Warteschlange vorhanden ist, aber nachfolgende Aufrufe geben nichts zurück. Nach fünf Minuten wird der Anruf die Nachricht erneut zurückgeben.

Fünf Minuten ist die maximale Sperrzeit für BrokeredMessage , also frage ich mich, ob PeekBatch diese Nachrichten tatsächlich sperrt, wie es bei einem Empfang der Fall ist, obwohl das Spähen nicht gesperrt werden sollte, soweit ich weiß.

Ich versuche, eine MVC-Ansicht zu erstellen, um sehen zu können, was tatsächlich in meiner Warteschlange sitzt, aber dieses ist in die Quere. Kann jemand dazu eine Anleitung geben?

Update : Dies scheint nur zu passieren, wenn ich meine QueueClient mit einer statischen Eigenschaft zwischenspeichern. Wenn ich jedesmal QueueClient fresh anlege, funktioniert PeekBatch wie erwartet. Ich habe immer noch keine Ahnung, warum die Wiederverwendung von QueueClient dies verursacht. Microsoft scheint zu empfehlen, das QueueClient zwar zu verwenden , anstatt es jedes Mal neu zu erstellen, also bin ich immer noch ratlos.

    
Michael 29.08.2013, 20:50
quelle

1 Antwort

13

Der QueueClient ist etwas hilfreich. In den Peek-Methoden (Peek und PeekBatch) können Sie sie einfach aufrufen, oder Sie können eine bestimmte Sequenznummer angeben, um eine bestimmte Nachricht nach einer bestimmten Sequenznummer abzurufen. Wenn Sie einfach Peek oder in Ihrem Fall PeekBatch ohne Sequenznummer aufrufen, wird die erste Nachricht oder die ersten Nachrichten in der Warteschlange abgerufen. Sobald die Nachricht zurückgegeben wird, verfolgt der QueueClient die letzte Sequenznummer, die er gezogen hat. Jeder nachfolgende Aufruf von Peek ruft die nächste Nachricht in der Warteschlange ab. Die Idee ist, dass Sie die Nachrichten durchsuchen und nicht nur jedes Mal an der ersten Nachricht in der Warteschlange interessiert sind.

Wenn Sie also in einer Schleife waren und peek wiederholt aufgerufen haben, bis sie keine Nachricht zurücksendet, würden Sie im Prinzip alle Nachrichten in der Warteschlange durchsucht haben.

Da Sie PeekBatch ohne Sequenznummer aufrufen, merkt sich der QueueClient den letzten Satz, den er bekommen hat, dann würde der nächste Aufruf tatsächlich versuchen, den nächsten Satz nach der letzten durchsuchten Nachricht zu erhalten. Aus diesem Grund scheint der QueueClient neu zu erstellen, wenn Sie ihn neu erstellen. Der Grund, warum es nach 5 Minuten auf sich selbst zurückgesetzt zu sein scheint, scheint merkwürdig, aber es könnte sein, dass es die Browser-Werte nach einem bestimmten Punkt, der mit der Timeout-Operation in der Warteschlange verknüpft ist, einfach ausräumt. Bis dahin wäre die Sequenznummer sowieso ziemlich weit entfernt, wenn es sich um eine vielbeschäftigte Warteschlange handelte.

Wenn Sie wirklich nur die erste Nachricht betrachten müssen, dann rufen Sie peek nur einmal auf. Es wird nur die erste Nachricht zurückgeben. Wenn du jedes Mal die erste Nachricht ziehen musst, mache einen Peek (0). Wenn Sie die ersten 10 Nachrichten jedes Mal sagen wollen, dann rufen Sie PeekBatch (0, 10) auf; Das ist so, als würde ich sagen, geben Sie mir die ersten zehn Nachrichten, die eine Sequenznummer größer als 0 haben.

Die Anleitung zur Wiederverwendung des QueueClient ist fundiert. Es macht alle Arten von Caching von Informationen und Dingen. Sie möchten es nicht jedes Mal neu erstellen müssen.

    
MikeWo 30.08.2013, 02:11
quelle

Tags und Links