概要

AEM(CQ)5.6 では、ワークフローシステムを保持するために、ワークフロー JMX MBean のサポートが追加されました。ワークフローは、OSGi サービスレジストリに MBean サービスとして登録されています。この MBean は、ワークフロー操作を公開する JMX コンソールで使用できます。実行可能な 15 の操作がセクション「サポートされている機能」の下にリストされています。ワークフローを監視する方法の一部は次のとおりです

  • Felix コンソールを介したユーザーインターフェイスの使用
  • CURL の使用
  • ワークフロー MBean を使用する JMX クライアントの作成

サポートされている機能

Workflow JMX

パージの完了したワークフロー

  • ワークフローが完了した後の特定の日数の経過後。 
  • モデルのワークフローが完了した後の特定の日数の経過後に、モデルごとにオプションを指定できます。
  • また、ドライランを実行し、パージされている完了したワークフローをプレビューすることもできます。

アクティブワークフローのパージ

  • ワークフローがアクティブになった後の特定の日数の経過後。 
  • モデルのワークフローが動作して一定の日数が経過した後、モデルごとにオプションがあります。
  • また、パージされる実行中のワークフローをプレビューするドライランも実行できます。

古いワークフローのカウント

  • システム内の古いワークフローの数を返します。
  • モデルごとに古いワークフローの数を返すオプションがあります。

古いワークフローの再起動

  • システム内のすべての古いワークフロー。
  • モデルごとにすべての古いワークフローを再起動するオプションがあります。
  • また、ドライランを実行して、再起動する古いワークフローをプレビューすることもできます。

ワークフローモデルのリスト

  • システム内の id & name を持つすべての model 情報を返します。

数値の実行中のワークフロー

  • システム内の実行中のワークフローの数を返します。
  • モデルあたりの実行ワークフローの数を返すオプションがあります。

数値の完了したワークフロー

  • システム内の完了したワークフローの数を返します。
  • モデルごとに完了したワークフローの数を返すオプションがあります。

ワークフローが実行中のモデルリスト

  • システムで実行されているモデルあたりのすべてのワークフロー数を一覧表示します。

完了したワークフローモデルリスト

  • システムで完了したモデルごとのすべてのワークフロー数を一覧表示します。

ワークフローのキュー情報

  • システムを起動した時から、ジョブ、キュー名、アクティブなジョブ、平均処理時間、平均待機時間、キャンセルしたジョブ、失敗したジョブ、完了したジョブ、処理したジョブ、待機中のジョブなどの情報を取得します。

ワークフローのジョブトピック情報

  • トピック名、平均処理時間、平均待機時間、キャンセルしたジョブ、失敗したジョブ、完了したジョブ、処理したジョブなどのワークフローのジョブトピック情報を取得します。

失敗したワークフローの数

  • システムで失敗したワークフローの数を返します。
  • モデルごとに失敗したワークフローの数を返すオプションがあります。

失敗したワークフローモデルのリスト

  • システム内で失敗したモデルごとのすべてのワークフロー数を一覧表示します。

失敗したインスタンス

  • システム内のすべての失敗したワークフローインスタンスを終了します。
  • モデルごとに、失敗したすべてのワークフローインスタンスを終了するオプションがあります。
  • 停止したワークフローのインスタンスをプレビューするには、ドライ実行を実行します。
  • システム内のすべての失敗したワークフローインスタンスを再起動します。
  • モデルごとに、失敗したすべてのワークフローインスタンスを再起動するオプションがあります。
  • Dry を実行して、再起動する失敗のワークフローインスタンスをプレビューします。

作業項目のリンク先が見つかりません

  • システムでの workitems の再試行に失敗しました。
  • システム内のモデルごとにすべての失敗した workitems を再試行するオプションがあります。
  • ドライ実行を実行して、再試行する失敗をした workitems をプレビューします。

注意:

現在、1 日以上のワークフローをパージできます。

入力パラメーター

合計 15 の操作があると、操作は次の5つのパラメーターが必要になることがあります。Namely

  • model (オプション)- これはオプションで、値は workflow model id である。例:- /etc/workflow/models/request_for_activation/jcr:content/model
  • ワークフローが完了してからの日数。これは、purgeCompleted 操作の必須フィールドです。これは、1 以上にする必要があります。
  • ワーフローが開始された日からの日数。purgeActive 操作の必須フィールドです。これは、1以上である必要があります。
  • ドライラン:値は true または false です。デフォルトは false です。 
  • インスタンスを再起動します。値は true または false です。デフォルトは false です。

ワークフローを監視するオプション

次の3つの方法があります。すなわち、

Felix コンソール経由のユーザーインターフェイス

下記のいずれかにより、お気に入りの Web ブラウザーアクセス Felix コンソールを使用する

  • http://localhost:4502/system/console/jmx/com.adobe.granite.workflow:type=Maintenance または「Web コンソール」>「メイン」>「JMX」>「com.adobe.granite.workflow」>「メンテナンス」
  • 実行する 15 の操作のいずれかを選択します。
  • パラメーターを入力し、起動します。
Purge Completed

cURL

括弧間のすべての値を実際の値と置き換えます。例:- true である <dryRun>

完了したワークフローのパージ

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

例:- パージされる 1 日での request_for_activation モデルであるすべてのワークフローをプレビューする cURL コマンドは次のとおりです

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

アクティブワークフローのパージ

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

古いワークフローのカウント

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

古いワークフローの再起動

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

ワークフローモデルのリスト

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

実行中のワークフローのカウント

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

数値の完了したワークフロー

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/

完了したワークフローモデルリスト

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

ワークフローのキュー情報

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

ワークフローのジョブトピック情報

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

数値の失敗したワークフロー

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

失敗したワークフローモデルのリスト

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

失敗したインスタンス

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

失敗した作業項目

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

ワークフロー MBean を使用する JMX クライアントの作成

以下は、15 すべてのワークフロー操作を実行し、出力を印刷するサンプル jmx クライアントコードです。入力パラメーターはドライランで、1 までの numberOfDays はすべてのモデルが対象です。

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

ビデオ

注意:

YouTube http://youtu.be/aXQgd-Vuqzg からビデオ再生に関する問題が発生した場合

JMX を介したワークフローの監視方法

JMX を介したワークフローの監視方法

本作品は Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License によってライセンス許可を受けています。  Twitter™ および Facebook の投稿には、Creative Commons の規約内容は適用されません。

法律上の注意   |   プライバシーポリシー