2017-10-19 3 views
1

Ich verwende einige Tests, die Azure CloudQueue verwenden, und als Setup/Teardown rufe ich CreateIfNotExistsAsync() und DeleteIfExistsAsync(). Wenn ich jedoch meine Tests rückwärts laufen lasse, habe ich eine Microsoft.WindowsAzure.Storage.StorageException erhalten, "Der Remote-Server hat einen Fehler zurückgegeben: (409) Conflict."Wie kann ich darauf warten, dass eine Azure CloudQueue gelöscht wird?

await cloudQueue.CreateIfNotExistsAsync(); 
    // do work 1 
    await cloudQueue.DeleteIfExistsAsync(); 
    await cloudQueue.CreateIfNotExistsAsync(); // throws exception 
    // do work 2 

Nach einen genaueren Blick auf die Antwort des Servers nehmen, fand ich die StatusDescription sagt „Die angegebene Warteschlange gelöscht wird.“

Gibt es eine Methode, die ich aufrufen kann, so dass ich weiß, dass die Warteschlange bereits gelöscht ist, sobald es zurückkehrt?

============================================== ======================== UPDATE Jetzt, dass ich daran denke. Wenn Azure Queue-Server will mit Lösch Ergebnis antworten, wird es den Überblick über unfertige eingehende Anfrage zu halten, was natürlich schlecht Desgin (anfällig für DoS-Angriff) ist ...

Antwort

1

Is there a method that I can call so that once it returns, I know for sure the queue is already deleted?

Leider nein. Das Löschen einer Warteschlange (oder eines Blob-Containers/einer Tabelle/Dateifreigabe) ist ein asynchroner Vorgang. Wenn Sie eine Anforderung zum Löschen einer Warteschlange senden, markiert Azure Storage diese Warteschlange zum Löschen (damit keine Operationen ausgeführt werden können) und löscht die Warteschlange anschließend durch einen Hintergrundprozess. Aufgrund der Dokumentation kann das Löschen einer Warteschlange bis zu 30 Sekunden dauern. Es kann jedoch mehr davon abhängen, wie viele Daten dort gespeichert sind.

Vom documentation:

When a queue is successfully deleted, the queue is immediately marked for deletion and is no longer accessible to clients. The queue is later removed from the Queue service during garbage collection.

Mögliche Lösung:

Da es keine Methode gibt, die Sie aufrufen können, die Ihnen sicher sagen wird, dass eine Warteschlange bereits gelöscht, was Sie müssten do versucht, die Warteschlange mit CreateIfNotExistsAsync zu erstellen und einen Fehler abzufangen. Wenn der HTTP-Statuscode Conflict (409) ist und der Fehlercode QueueBeingDeleted lautet, sollten Sie einige Zeit warten und den Vorgang wiederholen. Wenn Sie möchten, können Sie eine inkrementelle Verzögerung zwischen den Wiederholungen setzen.

Verwandte Themen