Invocation de service

Le projet asset-integration-starter contient une classe com.example.service.client.CustomServiceClient pour illustrer l’appel de service.

La classe CustomServiceClient obtient une référence à l'objet SystemGateway pour le système représenté par un identificateur Foo en appelant la méthode SystemGatewayFactory.getSystemGateway avec Foo comme argument. La méthode SystemGatewayFactory.getSystemGateway fournit donc un descripteur à n’importe quel système cible en spécifiant son systemId. Une fois que le descripteur est obtenu en tant qu'objet SystemGateway, il peut être utilisé pour appeler un service sur le système cible respectif. Voici le fragment de code correspondant de la classe CustomServiceClient :
private SystemGateway systemGateway = SystemGatewayFactory.getSystemGateway("Foo");

SystemGateway

com.hcl.unica.system.integration.service.gateway.SystemGateway fournit une méthode surchargée executeService, pour l'exécution d'un service sur le système cible. Une version de cette méthode permet d'exécuter tout service déclaré dans les fichiers de déclaration de service (<ASSET_PICKER_HOME>/conf/custom-plugin-services.yml et <ASSET_PICKER_HOME>/conf/plugin-services.yml pour le système respectif. L'autre version permet d'exécuter un appel HTTP ad hoc sur le système cible sans déclarer de service explicite dans le fichier de déclaration de service. Les deux versions de la méthode executeService avec leurs signatures sont les suivantes :

  • <RQ, RS> RS executeService(String serviceName, RQ serviceInput, Class<? extends ServiceGateway<RQ, RS>> gatewayClass) throws ServiceExecutionException
    Il s’agit d’une méthode générique qui fonctionne avec les paramètres de type RQ et RS. La signification de RQ et RS est la même que celle mentionnée précédemment. Cette méthode permet d'exécuter un service déjà déclaré. La méthode invocationDemo dans la classe CustomServiceClient illustre l’utilisation de cette méthode. Elle accepte les arguments suivants :
    • String serviceName

      Il doit s’agir du nom du service à exécuter. Le nom du service doit correspondre exactement à la déclaration correspondante dans le fichier de déclaration de service.

    • RQ serviceInput

      Il s’agit d’une entrée pour le service en cours d’exécution. Le paramètre de type RQ représente le type d’entrée requis pour le service appelé.

    • Class<? extends ServiceGateway<RQ, RS>> gatewayClass

      Il doit être identique à la valeur de retour de la méthode getServiceInterface dans l'implémentation de service correspondante. Il permet à Content Integration Framework d’identifier l’entrée correcte pour le service en cours d’exécution et renvoie la sortie du type souhaité. Les paramètres de type RQ et RS utilisés pour l’argument gatewayClass représentent le type d’entrée fourni lors de l’appel de service et le type de réponse renvoyé par le service à la fin, respectivement.

    En cas de réussite, cette méthode renvoie l’objet de type représenté par le paramètre de type RS. Par conséquent, le troisième argument de la méthode executeService, gatewayClass , régit le type d’entrée qui entre dans le service et le type de valeur renvoyé par le service.

  • <T> HttpResponse<T> executeService(HttpRequest request, Class<T> expectedResponse) throws ServiceExecutionException
    Il s’agit également d’une méthode générique, dans laquelle le paramètre de type T représente le type de réponse attendu par l’appel HTTP distant. Il permet d'effectuer un appel HTTP ad hoc sur le système cible sans déclarer de service explicite pour ce dernier dans le fichier de déclaration de service. La méthode adHocInvocationDemo de la classe CustomServiceClient illustre l’utilisation de cette méthode. Elle accepte les arguments répertoriés suivants :
    • Requête HTTPRequest

      Il doit s’agir d’un objet de la classe com.hcl.unica.system.model.request.HttpRequest. HttpRequest fournit une interface de générateur pour la construction de l’objet avec les détails requis. Cet objet encapsule essentiellement les détails requis pour effectuer un appel HTTP, tels que l’URL absolue, la méthode de requête HTTP, les en-têtes de requête HTTP et le corps de requête HTTP ou la charge de requête HTTP.

    • Class<T> expectedResponse

      Cela doit indiquer le type de réponse attendu par l'URL distante. Les types Jackson et JAXB peuvent également être utilisés. La désérialisation de JSON/XML se produira automatiquement dans ce cas.

    En cas de réussite, cette méthode renvoie l’objet com.hcl.unica.system.model.response.HttpResponse, en encapsulant l’objet de réponse à partir de l’appel distant. Le type de réponse encapsulé par HttpResponse sera le même que celui de l'argument expectedResponse de la méthode executeService. L'objet HttpResponse donne accès au code de statut de réponse HTTP, aux en-têtes de réponse et aux cookies de réponse, en plus de la charge de réponse.

Les deux versions de la méthode executeService peuvent générer l'exception com.hcl.unica.system.integration.exception.ServiceExecutionException ou l'un de ses sous-types si quelque chose se passe mal pendant l'exécution du service. L’objet de cette exception peut être consulté pour la cause immédiate de l’échec d’exécution de service. De même, si le service appelé représente un service REST/HTTP (les appels de service ad-hoc sont toujours des appels HTTP) et que l’échec se produit en dehors de l’interaction HTTP, un objet HttpResponse facultatif peut également être obtenu à partir de l’exception. Dans ce cas, l'exception HttpServiceExecutionException est renvoyée par les méthodes executeService. La présence de HttpResponse dépend du fait que l’interaction HTTP s’est produite ou non. L'exception HttpServiceExecutionException peut être reçue en raison d’une exception dans toute logique exécutée avant l’appel HTTP réel, telle que la méthode buildRequest d’un service déclaré.

La méthode executeService peut également renvoyer une exception SystemNotFoundException si le plug-in du système cible spécifié n'est pas présent ou si le système correspondant n'est pas intégré dans Unica Platform. De même, elle peut renvoyer une exception ServiceNotFoundException si le service spécifié n'est pas déclaré dans le fichier de déclaration de service ou n'est pas implémenté par le plug-in.

Remarque :
  • Vous remarquerez que le type de l'entrée vers custom-service est le même que le type utilisé pour l'implémentation du service dans la classe com.example.service.rest.CustomService ou la classe com.example.service.functional.CustomService. Le type de sortie est le même que celui utilisé pour définir l'interface CustomServiceGateway dont l'objet de classe est renvoyé par la méthode getServiceInterface dans les deux versions d'implémentation CustomService.
  • Les classes com.example.service.rest.CustomService et com.example.service.functional.CustomService représentent le même service implémenté avec deux approches différentes. Les fichiers de déclaration de service dans le projet asset-integration-starter, à savoir META-INF/rest-content-services.yml et META-INF/functional-content-services.yml ont une entrée pour custom-service, pointant vers les versions respectives de factoryClass. Ces deux versions sont uniquement fournies à titre d'illustration. A toutes fins pratiques, une seule version de l'implémentation du service est attendue par Content Integration Framework. Quelle que soit l'approche utilisée pour la mise en œuvre des services, la méthode d'appel des services reste la même.

Clients à plusieurs partitions

Depuis la perspective de l’implémentation du service, les objets ExecutionContext et SystemConfig, transmis aux différentes méthodes de rappel, contiennent des informations spécifiques à l’application client et à la partition. Depuis la perspective de l’appel de service, les services exécutés à l’aide de la méthode executeService, à partir de la classe SystemGateway, s’exécutent sur le système configuré pour l’application cliente appropriée et la partition de l’utilisateur qui accède à Unica Content Integration. Par conséquent, ni l’implémentation, ni l’utilisateur appelant ne doivent utiliser le partitionnement et d’autres détails contextuels de manière explicite. Content Integration Framework le gère automatiquement.