Einführung

In AEM (CQ) 5.6 wurde die Workflow JMX MBean-Unterstützung hinzugefügt, um das Workflow-System zu erhalten. Der Workflow ist in der „OSGi Service Registry“ als MBean-Service registriert. Diese MBean ist in der JMX-Konsole verfügbar, in der die Workflow-Operationen verfügbar sind. Es gibt 15 Operationen, die ausgeführt werden können, die im Abschnitt „Unterstützte Funktionen“ aufgeführt sind. Einige Möglichkeiten zum Überwachen des Workflows sind

  • Verwenden der Benutzeroberfläche über die Felix-Konsole
  • Verwenden von „CURL“
  • Erstellen von „JMX“, das den Arbeitsablauf „MBean“ verwendet

Unterstützte Funktionen

Workflow JMX

Abgeschlossene Workflows bereinigen

  • Nach einer bestimmten Anzahl von Tagen, seit der Workflow abgeschlossen wurde. 
  • Mit einer Option pro Modell nach einer bestimmten Anzahl von Tagen, nachdem der Workflow des Modells abgeschlossen ist.
  • Man kann auch einen Trockenlauf durchführen, um eine Vorschau eines abgeschlossenen Workflows anzuzeigen, der bereinigt werden würde.

Aktive Workflows bereinigen

  • Nach einer bestimmten Anzahl von Tagen, seit der Workflow aktiv ist. 
  • Mit einer Option pro Modell nach einer bestimmten Anzahl von Tagen, seit der Workflow des Modells ausgeführt wurde.
  • Sie können auch einen Probelauf ausführen, um eine Vorschau eines laufenden Workflows anzuzeigen, der gereinigt werden würde.

Alten Workflow zählen

  • Gibt die Anzahl alter Workflows im System zurück.
  • Mit einer Option zum Zurückgeben der Anzahl alter Workflows pro Modell.

Alten Workflow neu starten

  • All die alten Workflows im System.
  • Mit einer Option zum Neustart aller alten Workflows pro Modell.
  • Sie können auch einen Probelauf ausführen, um einen alten Workflow als Vorschau anzuzeigen, der neu gestartet werden würde.

Workflow-Modellliste

  • Gibt alle Workflow-Modellinformationen mit ID und Name im System zurück.

Anzahl der ausgeführten Workflows.

  • Gibt die Anzahl der ausgeführten Workflows im System zurück.
  • Mit einer Option zum Zurückgeben der Anzahl der ausgeführten Workflows pro Modell.

Anzahl abgeschlossener Workflows

  • Gibt die Anzahl der abgeschlossenen Workflows im System zurück.
  • Mit einer Option zum Zurückgeben der Anzahl der abgeschlossener Workflows pro Modell.

Ausgeführte Workflow-Modellliste.

  • Listet alle Workflow-Anzahlen pro Modell, die im System ausgeführt werden.

Abgeschlossene Workflow-Modellliste.

  • Listen Sie alle Workflow-Zählungen pro Modell auf, die im System abgeschlossen sind.

Workflow-Warteschlangeninformation

  • Von dem Zeitpunkt an, an dem das System gestartet wurde, erhalten Sie Informationen wie Aufträge, Queue-Name, aktive Aufträge, durchschnittliche Verarbeitungszeit, durchschnittliche Wartezeit, abgebrochene Aufträge, fehlgeschlagene Aufträge, beendete Aufträge, verarbeitete Aufträge und Aufträge in der Warteschlange.

Arbeitsflussauftrag-Themainformationen

  • Abrufen von Workflow-Auftrag-Themeninformationen wie Themenname, durchschnittliche Bearbeitungszeit, durchschnittliche Wartezeit, abgebrochene Aufträge, fehlgeschlagene Aufträge, beendete Aufträge und verarbeitete Aufträge.

Anzahl fehlgeschlagener Workflows

  • Gibt die Anzahl fehlgeschlagener Workflows im System zurück.
  • Mit einer Option zur Rückgabe der Anzahl fehlgeschlagener Workflows pro Modell.

Fehlgeschlagene Workflow-Musterliste

  • Listen Sie alle im System fehlgeschlagenen Workflow-Zählungen pro Modell auf.

Fehlgeschlagene Instanzen

  • Beenden Sie alle fehlgeschlagenen Instanzen im System.
  • Mit einer Option zum Beenden aller fehlgeschlagenen Instanzen pro Modell.
  • Führen Sie einen Trockenlauf durch, um eine Vorschau auf eine fehlgeschlagene Workflow-Instanz zu erhalten, die beendet werden würde.
  • Starten Sie alle fehlgeschlagenen Instanzen im System neu.
  • Mit einer Option zum erneuten Starten aller fehlgeschlagenen Instanzen.
  • Führen Sie einen Trockenlauf durch, um eine Vorschau der fehlgeschlagenen Workflow-Instanzen anzuzeigen, die neu gestartet werden würden.

Abgebrochene Arbeitselemente

  • Wiederholen Sie fehlgeschlagene Workitems im System.
  • Mit einer Option können Sie alle fehlgeschlagenen Workitems pro Modell im System wiederholen.
  • Führen Sie einen Trockenlauf durch, um eine Vorschau eines fehlgeschlagenen Workitems anzuzeigen, das erneut versucht werden würde.

Hinweis:

Derzeit können Sie die Workflows bereinigen, die länger als einen Tag dauern.

Eingabeparameter

Es gibt insgesamt 15 Operationen und einige Operationen können einen der folgenden fünf Parameter haben. Namely

  • model [optional]: Dies ist optional und der Wert sollte die Workflow-Modell-ID sein. Bsp:- /etc/workflow/models/request_for_activation/jcr:content/model
  • Anzahl der Tage seit Beendigung des Workflows: Dies ist ein Pflichtfeld für die Operation „purgeCompleted“. Dies sollte gleich oder größer als eins sein.
  • Anzahl der Tage seit Beendigung des Workflows: Dies ist ein Pflichtfeld für die Operation „purgeActive“. Dies sollte gleich oder größer als eins sein.
  • Testlauf: Der Wert kann wahr oder falsch sein. Der Standardwert lautet falsch. 
  • Starten Sie die Instanz neu: - Der Wert kann wahr oder falsch sein. Der Wert ist falsch.

Optionen zum Überwachen des Workflows

Es gibt drei Möglichkeiten

Benutzeroberfläche über die Felix-Konsole

Über Ihren bevorzugten Web-Browser können Sie auf die Felix-Konsole zugreifen, entweder per

  • http://localhost:4502/system/console/jmx/com.adobe.granite.workflow:type=Maintenance ODER Webkonsole > Main > JMX > com.adobe.granite.workflow > Maintenance
  • Wählen Sie einen von 15 Vorgängen aus, die Sie anwenden möchten.
  • Geben Sie die Parameter ein und rufen Sie auf.
Purge Completed

cURL

Ersetzt den gesamten Wert zwischen den Klammern durch den tatsächlichen Wert. Bsp.:- <dryRun> mit wahr

Abgeschlossene Workflows bereinigen

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

Beispiel: Der cURL-Befehl zur Vorschau aller Workflows, die sich im request_for_activation-Modell an einem zu bereinigenden Tag befinden, lautet

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

Reinigungs-aktive 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

Alten Workflow zählen

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

Alten Workflow neu starten

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-Modellliste

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

Laufender 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

Anzahl abgeschlossener Workflows

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

Ausgeführte Workflow-Modellliste

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

Abgeschlossene Workflow-Modellliste.

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

Workflow-Warteschlangeninformation

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

Arbeitsflussauftrag-Themainformationen

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

Anzahl fehlgeschlagener Workflows

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

Fehlgeschlagene Workflow-Musterliste

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

Fehlgeschlagene Instanzen

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

Abgebrochene Arbeitselemente

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

Erstellen von „JMX“, das den Arbeitsablauf „MBean“ verwendet

Nachfolgend finden Sie ein Beispiel für jmx-Client-Code, der alle 15 Workflow-Operationen ausführt und die Ausgabe ausdruckt. Die Eingabeparameter sind Trockenlauf, numberOfDays bis 1 und für alle Modelle.

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

Video

Hinweis:

Vielleicht tauchen Probleme beim Abspielen von Videos auf dem Kanal auf http://youtu.be/aXQgd-Vuqzg

So überwachen Sie den Arbeitsablauf über JMX

So überwachen Sie den Arbeitsablauf über JMX

Dieses Werk unterliegt den Bedingungen der Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License.  Twitter™- und Facebook-Beiträge fallen nicht unter die Bedingungen der Creative Commons-Lizenz.

Rechtliche Hinweise   |   Online-Datenschutzrichtlinie