VENTES: 1-800-867-1389

Gestion du cycle de vie d'un objet de messagerie

Mis à jour: mars 2014

Les objets de messagerie tels que TopicClient, QueueClient et SubscriptionClient sont destinés à être créés une fois puis réutilisés chaque fois que possible. Ces objets sont compatibles avec la sécurité des threads, ce qui vous permet d'envoyer ou de recevoir des messages en parallèle à partir de plusieurs threads. Une petite surcharge étant associée à l'authentification d'une demande client dans Microsoft Azure Active Directory Access Control (également appelé Access Control Service ou ACS) lors de la création d'un objet de messagerie, il est par conséquent recommandé de mettre en cache les instances des objets TopicClient, QueueClient et SubscriptionClient. Pour l'utilisation optimale des ressources, pensez à limiter la portée du cache à la durée de vie du composant de messagerie qui utilise les objets de messagerie Service Bus respectifs.

La durée de vie d'un objet de messagerie commence quand une nouvelle instance est récupérée à partir de l'objet MessagingFactory :

// The following actions are often performed upon initialization of an application-level messaging component.

string issuerName = "Issuer Name is retrieved from configuration file";
string issuerSecret = "Issuer Secret also comes from configuration file";
string serviceNamespace = "contoso-cloud";
string queuePath = "PurchaseOrders";

var credentials = TokenProvider.CreateSharedSecretTokenProvider(issuerName, issuerSecret);
var address = ServiceBusEnvironment.CreateServiceUri("sb", serviceNamespace, String.Empty);
var messagingFactory = MessagingFactory.Create(address, credentials);
var queueClient = messagingFactory.CreateQueueClient(queuePath, ReceiveMode.ReceiveAndDelete);

Comme indiqué plutôt, un objet QueueClient unique peut être réutilisé pour envoyer des messages vers une file d'attente donnée ou recevoir des messages de celle-ci. Il n'est pas nécessaire de créer une nouvelle instance de l'objet QueueClient pour chaque message envoyé ou reçu :

for (int i = 0; i < 5; i++)
{
    using (var msg = new BrokeredMessage(String.Format("Message #{0}", i)))
    {
        queueClient.Send(msg);
    }
}

Il est important de noter que les objets de messagerie maintiennent une connexion active avec l'infrastructure de messagerie Service Bus hébergée sur la plateforme Azure. Comme c'est le cas avec beaucoup d'autres types de services multi-locataires, les services de messagerie répartie fournis par Service Bus sont soumis à des quotas en ce qui concerne le nombre de connexions simultanées actives qu'une entité de messagerie unique (file d'attente, rubrique ou abonnement, par exemple) peut prendre en charge. Pour limiter au minimum le nombre de connexions simultanées , il est conseillé de contrôler explicitement la durée de vie des objets de messagerie Service Bus et de les fermer si vous n'envisagez pas de les réutiliser ultérieurement. Vous devez également fermer l'objet de fabrique de messagerie dès l'arrêt correct de votre solution de messagerie.

noteRemarque
La fermeture d'un objet de messagerie n'a pas pour corollaire la fermeture de la connexion sous-jacente dans la mesure où plusieurs objets de messagerie partagent la connexion à un niveau de fabrique. À son tour, la fermeture d'un objet de fabrique de messagerie ferme la connexion sous-jacente à l'infrastructure de messagerie Service Bus.

Pour fermer un objet de messagerie donné, vous devez appeler sa méthode Close() en utilisant l'une des techniques suivantes :

// When a queue client is no longer required, let's close it so that it doesn't consume a connection.

// Option #1: Closing a specific messaging object instance.
queueClient.Close();

// Option #2: Closing all messaging objects tracked by the messaging factory.
messagingFactory.Close();

Il est également intéressant de noter que dans certains cas rares, les objets de messagerie peuvent se retrouver dans un état qui les empêche de se fermer correctement. En pareille situation, l'API de messagerie répartie fera en sorte que les mesures appropriées soient prises, y compris l'abandon d'une connexion si celle-ci ne peut être fermée de façon appropriée. Vous n'avez pas besoin d'effectuer une vérification de l'état pour déterminer s'il faut appeler les méthodes Abort() ou Close(). Cette opération est effectuée en interne par l’API. Il est à noter qu'il n'est pas garanti que la méthode Close() s'exécute sans lever une exception. Par conséquent, si vous voulez vous assurer que la fermeture d’un objet de messagerie est toujours une opération sûre, il est recommandé de prévoir une couche de protection supplémentaire sous la forme d’une construction try/catch.

noteRemarque
Bien que la fermeture d'un objet de messagerie ne soit pas égale à une action Dispose, vous ne pouvez pas rouvrir un objet fermé si vous décidez plus tard de réutiliser l'instance fermée. Si vous essayez d'appeler une opération sur un objet de messagerie fermé, vous pouvez recevoir une exception explicite de type « Cette entité de messagerie a déjà été fermée, interrompue ou supprimée ». Il n'existe pas de méthode Open() publique pouvant être appelée à partir du client pour restaurer un objet de messagerie à un état ouvert. Vous devez créer une nouvelle instance de l'objet de messagerie. Cette recommandation s'applique également aux objets MessagingFactory.

La durée de vie d'un objet de messagerie se termine à l'appel de la méthode Close(). La meilleure façon de faire en sorte que tous les objets de messagerie utilisés par une solution soient correctement arrêtés est de fermer explicitement l'objet MessagingFactory utilisé pour créer des clients de messagerie pour les files d'attente, les rubriques et les abonnements. Une fermeture explicite MessagingFactory ferme implicitement tous les objets de messagerie créés par la classe et appartenant à celle-ci. Par exemple, vous pouvez fermer l'objet de la fabrique dans la méthode Dispose() du composant de messagerie, dans la méthode OnStop() fournie par RoleEntryPoint ou dans le gestionnaire d'événements UnhandledException.

Cela vous a-t-il été utile ?
(1500 caractères restants)
Merci pour vos suggestions.
Afficher:
© 2014 Microsoft