Dans AEM (CQ) 5.6, la prise en charge Workflow MBean JMX a été ajoutée pour conserver le système de flux de travail. Le Workflow est enregistré dans le registre de services OSGi en tant que service MBean. Ce fichier MBean est disponible dans la console JMX qui expose les opérations de flux de travail. 15 opérations pouvant être effectuées sont répertoriées dans la section Fonctionnalités prises en charge. Il existe plusieurs façons de surveiller le fux de travail :
- Utiliser l’interface utilisateur via la console Felix.
- Utiliser CURL.
- Créer un client JMX utilisant Workflow MBean.

Purge Completed Workflows
- Après un certain nombre de jours écoulés une fois le flux de travail terminé.
- Une option par modèle après un certain nombre de jours depuis que le flux de travail du modèle est terminé.
- Il est également possible d'effectuer une exécution d'essai afin de prévisualiser un flux de travail terminé qui serait purgé.
Purge Active Workflows
- Après un certain nombre de jours écoulés depuis que le flux de travail est actif.
- Avec une option par modèle après un certain nombre de jours écoulés depuis que le flux de travail du modèle est actif.
- Vous pouvez également exécuter une exécution d’essai pour prévisualiser un flux de travail en cours d’exécution qui sera purgé.
Count stale workflow
- Renvoie le nombre de flux de travaux obsolètes dans le système.
- Une option permet de renvoyer le nombre de flux de travaux obsolètes par modèle.
Restart stale workflow
- Tous les flux de travaux obsolètes du système.
- Avec une option permettant de redémarrer tous les flux de travaux obsolètes par modèle.
- Vous pouvez également effectuer une exécution d'essai pour prévisualiser un flux de travail obsolète qui serait redémarré.
Workflow model list
- Renvoie toutes les informations du modèle de flux de travail dont le nom et l’ID sont dans le système.
Count running workflow
- Renvoie le nombre de flux de travaux en cours d’exécution dans le système.
- Une option permet de renvoyer le nombre de flux de travaux en cours d’exécution par modèle.
Count completed workflow
- Renvoie le nombre de flux de travaux terminés dans le système.
- Une option permet de renvoyer le nombre de flux de travaux terminés par modèle.
Running Workflow model list
- Répertorie tous les workflows en cours d’exécution dans le système.
Completed Workflow model list
- Répertorie tous les workflows par modèle terminés dans le système.
Informations sur la file du processus
- Récupérer des informations à partir du démarrage système telles que les tâches, le nom de la file d’attente, les tâches actives, le temps de traitement moyen, le temps d’attente moyen, les travaux terminés, les travaux ayant échoué, les travaux traités et les travaux en file d’attente.
Workflow job topic information
- Renvoie les informations de tâche des workflows telles que nom de la rubrique, temps de traitement moyen, temps d’attente moyen, les tâches annulées, les travaux terminés et les travaux ayant échoué.
Count failed workflow
- Renvoie le nombre de workflows ayant échoué dans le système.
- Une option permet de renvoyer le nombre workflows ayant échoué par modèle.
Failed Workflow model list
- Répertorie tous les workflows par modèle qui ont échoué dans le système.
Failed Instances
- Arrête toutes les instances de workflows ayant échoué dans le système.
- Une option permet d’interrompre toutes les instances de workflows ayant échoué par modèle.
- Faire une exécution d'essai pour prévisualiser les instances de workflows ayant échoué.
- Relance toutes les instances de workflows ayant échoué dans le système.
- Une option permet de redémarrer toutes les instances de workflows ayant échoué par modèle.
- Faire une exécution d'essai pour prévisualiser les instances de workflows ayant échoué.
Failed Workitems
- Relance les éléments de travail ayant échoué dans le système.
- Une option permet de relancer les éléments de travail ayant échoué par modèle dans le système.
- Faire une exécution d'essai pour prévisualiser un élément de travail ayant échoué qui serait relancé.
Remarque :
Vous pouvez actuellement purger les workflows qui sont supérieurs à un jour.
Il y a 15 opérations au total et une opération peut posséder entre un et cinq des attributs suivants : Namely
- modèle [facultatif] : Cette option est facultative et la valeur doit correspondre à l’ID du modèle de workflow. Ex:- /etc/workflow/models/request_for_activation/jcr:content/model
- nombre de jours écoulés depuis le workflow : champ obligatoire pour les opérations purgeCompleted. Doit être égal ou supérieur à un.
- nombre de jours depuis le démarrage du workflow : Ce champ est obligatoire pour l’opération purgeActive. Doit être égal ou supérieur à un.
- dry run : La valeur peut être true ou false. La valeur par défaut est false.
- Redémarrer l’instance : La valeur peut être true ou false. False par défaut.
Utilisation de votre navigateur Web favori pour accéder à la console Felix, soit en
- tapant http://localhost:4502/system/console/jmx/com.adobe.granite.workflow:type=Maintenance OU Web console > Main > JMX > com.adobe.granite.workflow > Maintenance
- Sélectionnant parmi les 15 l’opération que vous souhaitez exécuter.
- Entrant les paramètres et en invoquant.

Remplacez la valeur entre crochets par une valeur réelle. Ex:- <dryRun> par true
Purge Completed Workflows
curl -u <UID>:<PASSWORD> -X POST --data "model [optional]=<modelId>&number of days since workflow has been completed=<numberOfDays>&dry run=<dryRun>" http://<host>:<PORT>/system/console/jmx/com.adobe.granite.workflow:type=Maintenance/op/purgeCompleted/java.lang.String,java.lang.Integer,java.lang.Boolean
Ex : La commande cURL pour prévisualiser tous les workflows qui se trouvent dans le modèle request_for_activation est
curl -u admin:admin -X POST --data "model [optional]=/etc/workflow/models/request_for_activation/jcr:content/model&number of days since workflow has been completed=1&dry run=true" http://localhost:4502/system/console/jmx/com.adobe.granite.workflow:type=Maintenance/op/purgeCompleted/java.lang.String,java.lang.Integer,java.lang.Boolean
Purge Active Workflows
curl -u <UID>:<PASSWORD> -X POST --data "dry run=<dryRun>&model [optional]=<modelId>&number of days since workflow started=<numberOfDays>" http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.workflow:type=Maintenance/op/purgeActive/java.lang.String,java.lang.Integer,java.lang.Boolean
Count stale workflow
curl -u <UID>:<PASSWORD> -X POST --data "model [optional]=<modelId>" http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.workflow:type=Maintenance/op/countStaleWorkflows/java.lang.String
Restart stale workflow
curl -u <UID>:<PASSWORD> -X POST --data "dry run=<dryRun>&model [optional]=<modelId>" http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.workflow:type=Maintenance/op/restartStaleWorkflows/java.lang.String,java.lang.Boolean
Workflow model list
curl -u <UID>:<PASSWORD> -X POST http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.workflow:type=Maintenance/op/fetchModelList/
Count running workflow
curl -u <UID>:<PASSWORD> -X POST --data "model [optional]=<modelId>" http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.workflow:type=Maintenance/op/countRunningWorkflows/java.lang.String
Count completed workflow
curl -u <UID>:<PASSWORD> -X POST --data "model [optional]=<modelId>" http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.workflow:type=Maintenance/op/countCompletedWorkflows/java.lang.String
Running Workflow model list
curl -u <UID>:<PASSWORD> -X POST http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.workflow:type=Maintenance/op/listRunningWorkflowsPerModel/
Completed Workflow model list
curl -u <UID>:<PASSWORD> -X POST http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.workflow:type=Maintenance/op/listCompletedWorkflowsPerModel/
Workflow queue information
curl -u <UID>:<PASSWORD> -X POST http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.workflow:type=Maintenance/op/returnWorkflowQueueInfo/
Workflow job topic information
curl -u <UID>:<PASSWORD> -X POST http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.workflow:type=Maintenance/op/returnWorkflowJobTopicInfo/
Count failed workflow
curl -u <UID>:<PASSWORD> -X POST --data "model [optional]=<modelId>" http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.workflow:type=Maintenance/op/returnFailedWorkflowCount/java.lang.String
Failed Workflow model list
curl -u <UID>:<PASSWORD> -X POST http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.workflow:type=Maintenance/op/returnFailedWorkflowCountPerModel/
Failed Instances
curl -u <UID>:<PASSWORD> -X POST --data "dry run=<dryRun>&model [optional]=<modelId>&restart the instance=<restartInstance>" http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.workflow:type=Maintenance/op/terminateFailedInstances/boolean,boolean,java.lang.String
Failed Workitems
curl -u <UID>:<PASSWORD> -X POST --data "dry run=<dryRun>&model [optional]=<modelId>" http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.workflow:type=Maintenance/op/retryFailedWorkItems/boolean,java.lang.String
Vous trouverez ci-dessous un code client jmx d'exemple qui exécute les 15 opérations et affiche la sortie. Les paramètres d'entrées sont Exécution d'essai, numberOfDays à 1 et pour tous les modèles.
import javax.management.DynamicMBean; import java.util.Hashtable; import javax.management.openmbean.TabularData; import javax.management.MBeanServerConnection; import javax.management.MBeanServerInvocationHandler; import javax.management.ObjectName; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; import javax.management.openmbean.CompositeData; import javax.management.openmbean.CompositeType; public class WorkflowJMXSampleClient { public static void main(String[] args) throws Exception{ String userid = "admin"; String password = "admin"; String serverUrl = "service:jmx:rmi:///jndi/rmi://localhost:9000/jmxrmi"; String OBJECT_NAME = "com.adobe.granite.workflow:type=Maintenance"; String[] buffer = new String[] { userid, password }; Hashtable<String, String[]> attributes = new Hashtable<String, String[]>(); attributes.put("jmx.remote.credentials", (String[]) buffer); MBeanServerConnection server = (MBeanServerConnection) JMXConnectorFactory.connect(new JMXServiceURL(serverUrl), attributes).getMBeanServerConnection(); ObjectName name = new ObjectName(OBJECT_NAME); WorkflowMBean workflow = (WorkflowMBean) MBeanServerInvocationHandler.newProxyInstance(server, name, WorkflowMBean.class,false); /* Execute all the methods*/ String model = ""; Integer numberOfDays = 1 ; Boolean dryRun = true; boolean restartInstance = false; logTabularData("purgeCompleted",workflow.purgeCompleted( model, numberOfDays, dryRun)); logTabularData("purgeActive",workflow.purgeActive( model, numberOfDays, dryRun)); logCount("countStaleWorkflows",workflow.countStaleWorkflows( model)); logTabularData("restartStaleWorkflows",workflow.restartStaleWorkflows( model, dryRun) ); logTabularData("fetchModelList",workflow.fetchModelList() ); logCount("countRunningWorkflows",workflow.countRunningWorkflows( model) ); logCount("countCompletedWorkflows",workflow.countCompletedWorkflows( model) ); logTabularData("listRunningWorkflowsPerModel",workflow.listRunningWorkflowsPerModel() ); logTabularData("listCompletedWorkflowsPerModel",workflow.listCompletedWorkflowsPerModel() ); logTabularData("returnWorkflowQueueInfo",workflow.returnWorkflowQueueInfo() ); logTabularData("returnWorkflowJobTopicInfo",workflow.returnWorkflowJobTopicInfo() ); logCount("returnFailedWorkflowCount",workflow.returnFailedWorkflowCount( model) ); logTabularData("returnFailedWorkflowCountPerModel",workflow.returnFailedWorkflowCountPerModel() ); logTabularData("terminateFailedInstances",workflow.terminateFailedInstances( restartInstance, dryRun, model) ); logTabularData("retryFailedWorkItems",workflow.retryFailedWorkItems( dryRun, model)); } public static void logTabularData(String operation, TabularData data) { System.out.println("-----Operation "+operation+"--------------"); try { System.out.println("Number of records "+data.size()); int counter = 0; for (Object o : data.values()) { System.out.println("Record Number "+(++counter)); CompositeData row = (CompositeData) o; CompositeType type = row.getCompositeType(); for (Object k : type.keySet()) { String key = k.toString(); System.out.println(key + " -- "+ row.get(key)); } } } catch (Exception e) { System.out.println("-----Error during operation "+operation+"--------------"+e.getMessage()); } System.out.println("-----Completed "+operation+"--------------"); System.out.println(" "); } public static void logCount(String operation, int counter) { System.out.println("--------------"+operation+"--------------"); try { System.out.println("count is "+counter); } catch (Exception e) { System.out.println("-----Error during operation "+operation+"--------------"+e.getMessage()); } System.out.println("-----Completed "+operation+"--------------"); System.out.println(" "); } public static interface WorkflowMBean extends DynamicMBean { public TabularData purgeCompleted(String model,Integer numberOfDays,Boolean dryRun); public TabularData purgeActive(String model, Integer numberOfDays, Boolean dryRun); public int countStaleWorkflows(String model); public TabularData restartStaleWorkflows(String model,Boolean dryRun) ; public TabularData fetchModelList() ; public int countRunningWorkflows(String model) ; public int countCompletedWorkflows(String model) ; public TabularData listRunningWorkflowsPerModel() ; public TabularData listCompletedWorkflowsPerModel() ; public TabularData returnWorkflowQueueInfo() ; public TabularData returnWorkflowJobTopicInfo() ; public int returnFailedWorkflowCount(String model) ; public TabularData returnFailedWorkflowCountPerModel() ; public TabularData terminateFailedInstances(boolean restartInstance,boolean dryRun,String model) ; public TabularData retryFailedWorkItems(boolean dryRun,String model); } }
Remarque :
Si vous rencontrez un problème lors de la lecture de la vidéo, rendez-vous à l'adresse : http://youtu.be/aXQgd-Vuqzg