Introducción

Se ha añadido el soporte del flujo de trabajo JMX MBean en AEM(CQ) 5.6 para mantener el sistema del flujo de trabajo. El flujo de trabajo está registrado en el registro de servicios de OSGi como servicio MBean. Este MBean está disponible en la consola JMX, la cual muestra las operaciones de flujo de trabajo. Se pueden realizar 15 operaciones que se enumeran en la sección Funciones soportadas. Algunas de las formas de monitorizar el flujo de trabajo son:

  • Uso de la interfaz de usuario a través de la consola Felix
  • Uso de CURL
  • Creación del cliente JMX que utiliza el Workflow MBean

Funciones compatibles

Workflow JMX

Purga de los flujos de trabajo completados

  • Después de un cierto número de días desde que se ha completado el flujo de trabajo. 
  • Con una opción por modelo tras un cierto número de días desde que se haya completado el flujo de trabajo del modelo.
  • También puede realizar un simulacro para obtener una vista previa de un flujo de trabajo completado que se purgaría.

Purga de los flujos de trabajo activos

  • Después de un cierto número de días desde que el flujo de trabajo ha estado activo. 
  • Con una opción por modelo después de un cierto número de días desde que se haya ejecutado el flujo de trabajo del modelo.
  • También puede realizar un simulacro para obtener una vista previa de un flujo de trabajo en ejecución que se purgaría.

Recuento del flujo de trabajo obsoleto

  • Devuelve el recuento de los flujos de trabajo obsoletos en el sistema.
  • Con una opción para devolver el recuento de flujos de trabajo obsoletos por modelo.

Reinicio del flujo de trabajo obsoleto

  • Todos los flujos de trabajo obsoletos del sistema.
  • Con una opción para reiniciar todos los flujos de trabajo obsoletos por modelo.
  • También puede realizar un simulacro para obtener una vista previa de un flujo de trabajo obsoleto que se reiniciaría.

Lista de modelos del flujo de trabajo

  • Devuelve toda la información del modelo del flujo de trabajo con ID y nombre en el sistema.

Recuento del flujo de trabajo en ejecución

  • Devuelve el recuento de los flujos de trabajo en ejecución en el sistema.
  • Con una opción para devolver el recuento de los flujos de trabajo en ejecución por modelo.

Recuento del flujo de trabajo completado

  • Devuelve el recuento de los flujos de trabajo completados en el sistema.
  • Con una opción para devolver el recuento de los flujos de trabajo completados por modelo.

Lista de modelos del flujo de trabajo en ejecución

  • Enumere todo el recuento de flujo de trabajo por modelo que se está ejecutando en el sistema.

Lista de modelos del flujo de trabajo completado

  • Enumere todos los recuentos del flujo de trabajo por modelo que están completados en el sistema.

Información de la cola del flujo de trabajo

  • Recupere información como trabajos, nombre de cola, trabajos activos, tiempo de procesamiento promedio, tiempo de espera promedio, trabajos cancelados, trabajos fallidos, trabajos completados, trabajos procesados y trabajos en cola desde el momento en que se inició el sistema.

Información sobre el tema de la tarea del flujo de trabajo

  • Recupere información sobre los temas de las tareas del flujo de trabajo como nombre del tema, tiempo de procesamiento promedio, tiempo de espera promedio, trabajos cancelados, trabajos fallidos, trabajos finalizados y trabajos procesados.

Recuento del flujo de trabajo fallido

  • Devuelve el recuento de los flujos de trabajo fallidos en el sistema.
  • Con la opción de devolver el conteo de flujos de trabajo fallidos por modelo.

Lista de modelos de flujo de trabajo fallido

  • Enumere todos los recuentos de flujo de trabajo por modelo que han fallado en el sistema.

Instancias fallidas

  • Finalice todas las instancias de flujo de trabajo fallidas en el sistema.
  • Con una opción para finalizar todas las instancias de flujos de trabajo fallidos por modelo.
  • Realice un simulacro para obtener una vista previa de las instancias de flujo de trabajo fallidas que se terminarían.
  • Reinicie todas las instancias de flujo de trabajo fallidas en el sistema.
  • Con una opción para reiniciar todas las instancias de flujos de trabajo fallidos por modelo.
  • Realice un simulacro para obtener una vista previa de las instancias de flujo de trabajo fallidas que se reiniciarían.

Elementos de trabajo fallidos

  • Vuelva a probar los elementos fallidos en el sistema.
  • Con una opción para volver a probar todos los elementos de trabajo fallidos por modelo en el sistema.
  • Realice un simulacro para obtener una vista previa de los elementos de trabajo fallidos que se volverían a probar.

Nota:

Actualmente puede purgar los flujos de trabajo superiores a un día.

Parámetros de entrada

Hay 15 operaciones en total y algunas pueden tener cualquiera de los siguientes cinco parámetros. Concretamente:

  • modelo [opcional]: es opcional y el valor debe ser el ID del modelo de flujo de trabajo. Ejemplo: /etc/workflow/modelos/request_for_activation/jcr:content/model
  • número de días desde que se haya completado el flujo de trabajo: este campo es obligatorio para la operación purgeCompleted. Debe ser igual o mayor que uno.
  • número de días desde que se inició el flujo de trabajo: este campo es obligatorio para la operación purgeActive. Debe ser igual o mayor que uno.
  • simulacro: el valor puede ser verdadero o falso. El valor predeterminado es falso. 
  • reinicio de la instancia: el valor puede ser verdadero o falso. El valor predeterminado es falso.

Opciones para monitorizar el flujo de trabajo

Concretamente, hay tres maneras:

Interfaz de usuario a través de la consola Felix

Utilizando su navegador web favorito, acceda a la consola Felix a través de:

  • http://localhost:4502/system/console/jmx/com.adobe.granite.workflow:type=Maintenance o consola web > Principal > JMX > com.adobe.granite.workflow > Mantenimiento
  • Seleccione cualquiera de las 15 operaciones que desee ejecutar.
  • Introduzca los parámetros e invoque.
Purge Completed

cURL

Reemplace todo el valor entre paréntesis por el valor real. Ejemplo: <dryRun> con verdadero

Purga de los flujos de trabajo completados

curl -u <UID>:<PASSWORD> -X POST --data “model [optional]=<modelId> y número de días desde que se haya completado el flujo de trabajo=<numberOfDays> y simulacro=<dryRun>” http://<host>:<PORT>/system/console/jmx/com.adobe.granite.workflow:type=Maintenance/op/purgeCompleted/java.lang.String,java.lang.Integer,java.lang.Boolean

Ejemplo: el comando cURL para previsualizar todos los flujos de trabajo que están en el modelo request_for_activation en un día que sería purgado es

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

Purga de los flujos de trabajo activos

curl -u <UID>:<PASSWORD> -X POST --datos "dry run=<dryRun>&model [opcional]=<modelId> y número de días desde que empezó el flujo de trabajo=<numberOfDays>" http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.workflow:type=Maintenance/op/purgeActive/java.lang.String,java.lang.Integer,java.lang.Boolean

Recuento del flujo de trabajo obsoleto

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

Reinicio del flujo de trabajo obsoleto

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

Lista de modelos del flujo de trabajo

curl -u <UID>:<PASSWORD> -X POST http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.workflow:type=Maintenance/op/fetchModelList/

Recuento del flujo de trabajo en ejecución

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

Recuento del flujo de trabajo completado

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

Lista de modelos del flujo de trabajo en ejecución

curl -u <UID>:<PASSWORD> -X POST http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.workflow:type=Maintenance/op/listRunningWorkflowsPerModel/

Lista de modelos del flujo de trabajo completada

curl -u <UID>:<PASSWORD> -X POST http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.workflow:type=Maintenance/op/listCompletedWorkflowsPerModel/

Información de la cola del flujo de trabajo

curl -u <UID>:<PASSWORD> -X POST http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.workflow:type=Maintenance/op/returnWorkflowQueueInfo/

Información sobre el tema de la tarea del flujo de trabajo

curl -u <UID>:<PASSWORD> -X POST http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.workflow:type=Maintenance/op/returnWorkflowJobTopicInfo/

Recuento del flujo de trabajo con errores

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

Lista de modelos del flujo de trabajo con errores

curl -u <UID>:<PASSWORD> -X POST http://<HOST>:<PORT>/system/console/jmx/com.adobe.granite.workflow:type=Maintenance/op/returnFailedWorkflowCountPerModel/

Instancias con errores

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

Elementos de trabajo con errores

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

Creación del cliente JMX que utiliza el Workflow MBean

A continuación, se muestra un ejemplo del código de cliente jmx que ejecuta las 15 operaciones del flujo de trabajo e imprime el resultado. Los parámetros de entrada son simulacro, numberOfDays a 1 y para todos los modelos.

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); 
    }
}

Vídeo

Nota:

Si tiene problemas para reproducir el vídeo, véalo en YouTube en http://youtu.be/aXQgd-Vuqzg

Monitorización del flujo de trabajo mediante JMX

Monitorización del flujo de trabajo mediante JMX

Esta obra está autorizada con arreglo a la licencia de Reconocimiento-NoComercial-CompartirIgual 3.0 Unported de Creative Commons.  Los términos de Creative Commons no cubren las publicaciones en Twitter™ y Facebook.

Avisos legales   |   Política de privacidad en línea