2.4. Descripteurs de déploiement
Les processus et les règles de Red Hat JBoss BPM Suite 6 sont stockés dans un empacketage basé Apache Maven, et sont appelés kjar ( de l'anglais knowledge archives). Les règles, les processus, les ressources, etc. font partie d'un built de fichier jar, et sont gérés par Maven. Un fichier conservé dans le répertoire
META-INF du kjar appelé kmodule.xml peut être utilisé pour définir les bases de connaissances et de sessions. Par défaut, ce fichier kmodule.xml est vide.
Quand un composant de runtime comme Business Central est sur le point de traiter un kjar, il consulte
kmodule.xml pour construire la représentation de runtime.
Deployment Descriptors, les descripteurs de déploiement font partie d'une nouvelle fonctionnalité introduite dans la branche 6.1 de Red Hat JBoss BPM Suite, qui vous permet un contrôle affiné de votre déploiement et qui complémente le fichier
kmodule.xml. La présence de ces descripteurs est optionnelle et votre déploiement pourra avoir lieu sans qu'ils soient présents. Les propriétés qui vous pouvez définir en utilisant ces descripteurs sont purement techniques de nature, et incluent des meta valeurs comme la stratégie de runtime, l'auditing et la persistance.
Ces descipteurs vous permettent de configurer le serveur d'exécution sur plusieurs niveaux (niveau serveur par défaut, différents descripteurs de déploiement par kjar etc.). Cela vous permet de faire des personnalisations simples à la configuration out-of-the-box du serveur d'exécution (probablement par kjar).
Vous pouvez définir ces descripteurs dans un fichier nommé
kie-deployment-descriptor.xml et mettre ce fichier à côté de votre fichier kmodule.xml dans le dossier META-INF. Vous pouvez changer cet emplacement par défaut (et le nom du fichier) en le spécifiant comme paramètre système :
-Dorg.kie.deployment.desc.location=file:/path/to/file/company-deployment-descriptor.xml
2.4.1. Configuration du descripteur de déploiement
Les descripteurs de déploiement permettent à l'utilisateur de configurer le serveur d'exécution sur plusieurs niveaux :
- niveau serveur : le niveau principal, s'applique à tous les kjars déployés sur le serveur.
- niveau kjar : vous permet de configurer les descripteurs sur la base d'un kjar.
- niveau temps de déploiement : descripteurs qui s'appliquent quand un kjar est en cours de déploiement.
Les éléments de configuration granulaire spécifiés par les descripteurs de déploiement ont préséance sur ceux niveau serveur, sauf dans le cas d'éléments de configuration basés collection, qui sont fusionnés. La hiérarchie fonctionne comme ceci : configuration du temps de déploiement > configuration kjar > configuration du serveur.
Note
La configuration du temps de déploiement s'applique à des déploiements effectués via l'API REST.
Ainsi, si le mode de persistance (l'un des éléments que vous pouvez configurer) défini au niveau du serveur est
NONE, mais que le même mode est spécifié comme JPA au niveau kjar, le mode réel sera JPA pour cette kjar. Si rien n'est spécifié pour le mode de persistance dans le descripteur de déploiement pour ce kjar (ou s'il n'y a aucun descripteur de déploiement), cela renverra à la configuration niveau serveur, qui est dans ce cas NONE (aucun) (ou JPA s'il n'y a aucun descripteur de déploiement au niveau du serveur).
Pouvez-vous substituer ce comportement de mode de fusionnement par hiérarchie ?
Oui. Dans le mode par défaut, s'il existe des descripteurs de déploiement présents à plusieurs niveaux, les propriétés de configuration seront fusionnées avec les propriétés granulaires se substituant aux valeurs brutes, et avec les éléments de configuration manquants au niveau granulaire fournis par les valeurs présentes aux niveaux supérieurs. Le résultat final est une configuration fusionnée de descripteur de déploiement. Ce mode de fusion par défaut s'appelle le mode
MERGE_COLLECTIONS. Mais vous pouvez en changer (Section 2.4.2, « Gestion des descripteurs de déploiement ») si cela ne convient pas à votre environnement :
- KEEP_ALL: dans ce mode, toutes les valeurs de niveau supérieur remplacent toutes les valeurs de niveau inférieur (les valeurs de niveau serveur remplacent les valeurs kjar)
- OVERRIDE_ALL: dans ce mode, toutes les valeurs de niveau inférieur remplacent toutes les valeurs de niveau supérieur (les valeurs kjar remplacent les valeurs de niveau serveur)
- OVERRIDE_EMPTY: dans ce mode, tous les éléments de configuration non vides des niveaux inférieurs remplacent ceux des niveaux supérieurs, y compris les éléments qui sont représentés sous forme de collections.
- MERGE_COLLECTIONS (DEFAULT): dans ce mode, tous les éléments de configuration non vides de niveau inférieur remplacent les éléments de niveaux supérieurs (comme OVERRIDE_EMPTY), mais les propriétés de collection sont mergées (combinées).
Les descripteurs de déploiement des kjars dépendants sont mis à un niveau inférieur à celui auquel le kjar est déployé, mais ils sont toujours situés à un niveau supérieur par rapport au serveur.
Est-ce que je dois fournir un descripteur de déploiement complet pour tous les kjars ?
Non. Et c'est ici précisément que la fusion entre différents fichiers peut vous être utile. Il est possible et recommandé de fournir des descripteurs de déploiement partiels. Par exemple, si vous souhaitez substituer le mode auditing dans un kjar, vous aurez juste besoin de fournir ceci et le reste des valeurs sera fusionné du niveau serveur aux kjars de niveaux supérieurs.
Il est important de noter que quand on utilise le mode OVERRIDE_ALL, tous les éléments de configuration doivent être spécifiés car le kjar pertinent les utilisera toujours et ne mergera avec aucun autre descripteur de déploiement dans la hiérarchie.
Peut-on configurer ?
Les informations de configuration technique de haut niveau peuvent être configurées par les descripteurs de déploiement. Le tableau suivant en donne la liste, ainsi que des valeurs autorisées et par défaut pour chacun.
Tableau 2.1. Descripteurs de déploiement
| Configuration | Entrée XML | Valeurs autorisées | Valeur par défaut |
|---|---|---|---|
| Nom d'unité de persistance pour les données de runtime | persistence-unit | N'importe quel nom valide de package de persistance | org.jbpm.domain |
| Nom d'unité de persistance pour les données d'auditing | audit-persistence-unit | N'importe quel nom valide de package de persistance | org.jbpm.domain |
| Mode de persistance | persistence-mode | JPA, NONE | JPA |
| Mode d'auditing | audit-mode | JPA, JMS ou NONE | JPA |
| Stratégie de runtime | runtime-strategy | SINGLETON, PER_REQUEST ou PER_PROCESS_INSTANCE | SINGLETON |
| Liste des listeners d'événements à enregistrer | event-listeners | Noms de classe de listener comme ObjectModel | Pas de valeur par défaut |
| Liste des listeners d'événements de tâches à enregistrer | task-event-listeners | Noms de classe de listener comme ObjectModel | Pas de valeur par défaut |
| Liste de Work Item Handlers à enregistrer | work-item-handlers | Classes de Work Item Handlers données comme NamedObjectHandler | Pas de valeur par défaut |
| Liste des variables globales à enregistrer | globals | Variables globales valides données comme NamedObjectModel | Pas de valeur par défaut |
| Stratégies de marshalling à enregistrer (pour une persistance variable enfichable) | marshalling-strategies | Classes ObjectModel valides | Pas de valeur par défaut |
| Rôles exigés pour pouvoir avoir accès aux ressources du kjar | required-roles | Noms de rôles de string | Pas de valeur par défaut |
| Entrées environnementales supplémentaires pour les sessions de Knowledge | environment-entries | NamedObjectModel valide | Pas de valeur par défaut |
| Options de configuration supplémentaires pour les sessions de Knowledge | configurations | NamedObjectModel valide | Pas de valeur par défaut |
Comment procurer des valeurs aux éléments de configuration basés collections ?
Dans le tableau d'éléments de configuration valide vu plus haut, vous aurez sans doute remarqué que les valeurs valides pour les éléments basés collection sont soit
ObjectModel, soit NamedObjectModel. Les deux sont similaires et fournissent une définition de l'objet à construire ou créer pendant le runtime, sauf que les informations sur l'objet NamedObjectModel nomment l'objet à observer. Ces deux types sont définis à l'aide d'un identificateur, de paramètres facultatifs et d'un résolveur (qui résoudre l'objet).
- identifier - définit toutes les informations sur l'objet, comme le nom de classe complet, l'id du bean Spring ou une expression MVEL.
- parameters - paramètres optionnels qui doivent être utilisés quand on crée des instances d'objets à partir de ce modèle.
- resolver - identificateur du programme de résolution qui sera utilisé pour créer des instances d'objet à partir du modèle - (reflection, mvel ou Spring).
Ainsi, si vous avez construit une stratégie de marshaling personnalisée et que vous souhaitez que vos déploiements utilisent cette stratégie plutôt que de la valeur par défaut, vous devrez fournir cette stratégie comme
ObjectModel, avec pour identificateur com.mycompany.MyStrategy, le programme de résolution étant reflection (le plus simple et la valeur par défaut) et tous les paramètres requis pour que votre stratégie fonctionne. Reflexion servira ensuite pour créer une instance de cette stratégie en utilisant le nom de classe qualifié complet que vous avez fourni comme identificateur.
<marshalling-strategy>
<resolver>reflection</resolver>
<identifier>com.myCompany.MyStrategy</identifier>
<parameters>
<parameter xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema">
param
</parameter>
</parameters>
</marshalling-strategy>
Dans le cas où un programme de résolution basé reflection ne suffise pas (comme c'est le cas dans l'exemple précédent), vous pourrez utiliser un programme de résolution basé MVEL comme identificateur du modèle d'objet. Quand vous évaluez les expressions, vous pouvez substituer les paramètres out-of-the-box. Exemple :
<marshalling-strategy> <resolver>mvel</resolver> <identifier>new com.myCompany.CustomStrategy(runtimeManager)</identifier> </marshalling-strategy>
Le programme de résolution Spring vous permet de chercher un bean par son identificateur à partir d'un contexte d'application Spring. Chaque fois que JBoss BPM Suite est utilisée avec Spring, ce programme de résolution aide à déployer les kjars dans l'environnement de runtime. A titre d'exemple (à noter que l'identificateur est, dans ce cas, un bean nommé en contexte Spring) :
<marshalling-strategy> <resolver>spring</resolver> <identifier>customStrategy</identifier> </marshalling-strategy>
2.4.2. Gestion des descripteurs de déploiement
Les descripteurs de déploiement peuvent être modifiés via Business Central d'une des deux façons suivantes. Soit graphiquement (en cliquant sur Création → Création de projet, puis en sélectionnant Outils → Descripteur de déploiement) ou soit en cliquant sur le menu Création → Administration, puis en cliquant sur le dossier
META-INF de File Explorer. Cliquer sur le fichier kie-deployment-descriptor.xml pour pouvoir le modifier manuellement.
À chaque fois qu'un projet est créé, un fichier
kie-deployment-descriptor.xml de stockage est généré avec les valeurs par défaut décrites plus haut.
Remplacer le comportement de mode de fusionnement par hiérarhie
Pour changer le mode par défaut de MERGE_COLLECTIONS à KEEP_ALL, OVERRIDE_ALL ou OVERRIDE_EMPTY, vous pouvez utiliser une des méthodes suivantes, selon les besoins.
- Définir la propriété système org.kie.dd.mergemode à l'une des valeurs suivantes. Ce mode de fusion deviendra le mode par défaut de tous les kjars déployés dans le système, à moins que vous ne les remplaciez au niveau kjar par la prochaine méthode.
- Quand vous déployez une nouvelle unité de déploiement via Business Central (Déployer → Déploiements), vous pouvez sélectionner le mode de fusion à utiliser pour ce kjar particulier.
- Quand vous déployez via l'API REST, vous pouvez ajouter le paramètre de recherche mergemode à l'un de ces modes pour définir le mode de fusion pour ce déploiement.
Limiter l'accès à Runtime Engine
Un des éléments de configuration discutés plus tôt, required-roles, peut être modifié par les descripteurs de déploiement. Cette propriété limite l'accès au moteur d'exécution sur la base d'un kjar ou par niveau de serveur, en veillant à ce que l'accès à certains processus ne soit accordé qu'aux utilisateurs qui appartiennent à des groupes définis par cette propriété.
Le rôle de sécurité peut être utilisé pour limiter l'accès aux définitions de processus ou pour restreindre l'accès pendant le runtime.
Le comportement par défaut consiste à ajouter des rôles requis à cette propriété sur la base des restrictions du référentiel. Vous pouvez, biensûr, modifier ces propriétés manuellement si nécessaire, comme décrit ci-dessus, en fournissant des rôles qui correspondent aux rôles définis dans le domaine de sécurité.