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

概要

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

  • Felix コンソールを介したユーザーインターフェイスの使用
  • CURL の使用
  • ワークフロー MBean を使用する 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 の操作のいずれかを選択します。
  • パラメーターを入力し、起動します。

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 を介したワークフローの監視方法

アドビのロゴ

アカウントにログイン