Modèles : Invoquer de façon asynchrone avec un callback

Vue d'ensemble

Les services invoqués de manière asynchrone s'exécutent en arrière-plan sans bloquer le service à l'origine de l'appel.

Lors de l'exécution de self.invoke_async, le service appelant reçoit un identifiant de corrélation qui sera transmis au service cible exécuté de manière asynchrone en tant que self.cid de ce dernier, afin que les demandes puissent être corrélées aux réponses.

De plus, le service source peut fournir le nom d'un service qui servira de puits de callback consommant les réponses du service cible une fois celui-ci terminé.

Usage examples and API

Invocation asynchrone sans callback

Invoquez self.invoke_async pour que le service cible soit exécuté en arrière-plan. Un ID de corrélation est retourné en sortie - le service cible peut y accéder via self.cid.

from zato.server.service import Service

class MyService(Service):

    def handle(self):
        cid = self.invoke_async('zato.helpers.input-logger', 'Hello from async!')
        self.logger.info('I received a CID %r', cid)

Invocation asynchrone - callback explicite

Invoque la cible en fournissant le nom d'une callback à exécuter une fois la cible terminée. Toute réponse produite par la cible est disponible, sous forme de chaîne, sous self.request.payload dans la callback.

from zato.server.service import Service

class MyService(Service):

    def handle(self):
        self.invoke_async('zato.ping', 'Hello from async!', callback='my.callback')

class MyCallback(Service):
    name = 'my.callback'

    def handle(self):
        self.logger.info('I received %r', self.request.payload)

Invocation asynchrone - callback par convention

Par convention, s'il existe un service dont le nom est le nom du service invoquant plus -async-callback, ce service sera utilisé comme puits de rappel.

Par exemple, si un module Python contient un service dont le nom est égal à celui du service invoquant suivi de AsyncCallback, comme MyService et MyServiceAsyncCallback ci-dessous, ce service sera considéré comme un callback pour toutes les invocations asynchrones - ici, toutes les réponses asynchrones aux appels de MyService seront livrées à MyServiceAsyncCallback.

from zato.server.service import Service

class MyService(Service):

    def handle(self):
        self.invoke_async('zato.ping', 'Hello from async!')

class MyServiceAsyncCallback(Service):

    def handle(self):
        self.logger.info('I also received %r', self.request.payload)