2017-10-19 3 views
1

Je cours des tests qui utilisent Azure CloudQueue, et comme configuration/démontage j'appelle CreateIfNotExistsAsync() et DeleteIfExistsAsync(). Toutefois, lorsque j'exécute mes tests dos à dos, j'ai obtenu une exception Microsoft.WindowsAzure.Storage.StorageException, "Le serveur distant a renvoyé une erreur: (409) Conflit."Comment puis-je attendre la suppression d'une CloudQueue Azure?

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

Après avoir regarder de plus près la réponse du serveur, j'ai trouvé le StatusDescription dit « La file d'attente spécifiée a été supprimée. »

Existe-t-il une méthode que je puisse appeler pour qu'une fois retournée, je sache que la file d'attente est déjà supprimée?

============================================== =============================== MISE À JOUR Maintenant que j'y pense. Si Azure serveur Queue veut répondre avec un résultat de suppression, il devra garder une trace de requête entrante inachevée, ce qui est évidemment mauvaise desgin (vulnérable aux attaques DOS) ...

Répondre

1

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

Malheureusement pas. La suppression d'une file d'attente (ou d'un conteneur blob/table/partage de fichiers) est une opération asynchrone. Lorsque vous envoyez une demande de suppression d'une file d'attente, Azure Storage marque cette file d'attente pour suppression (afin qu'aucune opération ne puisse être effectuée sur celle-ci), puis supprime la file d'attente via un processus d'arrière-plan. Selon la documentation, la suppression d'une file d'attente peut prendre jusqu'à 30 secondes. Cependant, cela dépend peut-être davantage de la quantité de données qui s'y trouvent.

De l'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.

Solution possible:

Comme il n'y a pas de méthode que vous pouvez appeler qui vous dira sûr qu'une file d'attente est déjà supprimé, ce que vous devez faire est d'essayer de créer la file d'attente en utilisant CreateIfNotExistsAsync et d'attraper une erreur. Si le code d'état HTTP est Conflict (409) et que le code d'erreur est QueueBeingDeleted, attendez un certain temps et réessayez l'opération. Si vous le souhaitez, vous pouvez mettre un délai incrémentiel entre les tentatives.