現在表示中:

ワークフロー Java API の使用

ワークフロー Java API は、com.adobe.granite.workflow パッケージといくつかのサブパッケージで構成されます。この API の最も重要な構成要素は、com.adobe.granite.workflow.WorkflowSession クラスです。WorkflowSession クラスは、デザイン時と実行時に、次のワークフローオブジェクトへのアクセスを可能にします。

  • ワークフローモデル
  • 作業項目
  • ワークフローインスタンス
  • ワークフローデータ
  • インボックス項目

このクラスは、ワークフローのライフサイクルに介入するためのメソッドもいくつか提供します。

以下の表に、プログラムによってワークフローとやり取りする際に使用するいくつかの重要な Java オブジェクトの参照ドキュメントへのリンクを示します。以降の例では、コード内でクラスオブジェクトを取得および使用する方法を示します。

機能 オブジェクト
ワークフローへのアクセス
WorkflowSession
ワークフローインスタンスの実行とクエリ
Workflow
WorkItem
WorkflowData
ワークフローモデルの管理
WorkflowModel
WorkflowNode
WorkflowTransition
ワークフロー内にある(またはワークフロー内にない)ノードの情報 WorkflowStatus

ECMA スクリプトでのワークフローオブジェクトの取得

スクリプトの設置で説明したように、AEM は、サーバー側 ECMA スクリプトを実行する ECMA スクリプトエンジンを(Apache Sling を通じて)提供します。org.apache.sling.scripting.core.ScriptHelper クラスは、sling 変数としてスクリプトで直ちに使用できます。

ScriptHelper クラスは、SlingHttpServletRequest へのアクセスを可能にします。これを使用することによって、最終的に WorkflowSession オブジェクトを取得できます。以下に例を示します。

var wfsession = sling.getRequest().getResource().getResourceResolver().adaptTo(Packages.com.adobe.granite.workflow.WorkflowSession);

ワークフロー REST API の使用

ワークフローコンソールでは REST API がよく使用されるので、ここでは、ワークフロー用の REST API について説明します。

注意:

curl コマンドラインツールでは、ワークフロー REST API を使用して、ワークフローオブジェクトにアクセスし、インスタンスのライフサイクルを管理できます。このページの例では、curl コマンドラインツールから REST API を使用する方法を示します。

REST API では次の操作が可能です。

注意:

Web 開発用の Firefox の拡張機能である Firebug を使用すると、コンソールの操作時に HTTP トラフィックを追跡できます。例えば、POST リクエストにより AEM サーバーに送信されたパラメーターと値を確認できます。

このページでは、AEM がローカルホストのポート 4502 で動作しており、インストールコンテキストが「/」(ルート)であると想定しています。実際のインストール状況が異なる場合は、HTTP リクエストが適用される URI を実際の状況に合わせて変更してください。

GET リクエストに対応するレンダリングは JSON レンダリングです。GET の URL の拡張子は、次のように .json となる必要があります。

http://localhost:4502/etc/workflow.json

ワークフローインスタンスの管理

以下の HTTP リクエストメソッドが、次の URL に適用されます。

http://localhost:4502/etc/workflow/instances

HTTP リクエストメソッド アクション
GET 使用可能なワークフローインスタンスを一覧表示します。
POST

新しいワークフローインスタンスを作成します。パラメーターを以下に示します。
- model:対応するワークフローモデルの ID(URI)
- payloadType:ペイロードのタイプ(JCR_PATH または URL など)を格納します。
ペイロードはパラメーター payload として送信されます。新しいワークフローインスタンスリソースの URL を格納したロケーションヘッダーを持つ 201CREATED)の応答が返されます。

状態によるワークフローインスタンスの管理

以下の HTTP リクエストメソッドが、次の URL に適用されます。

http://localhost:4502/etc/workflow/instances.{state}

HTTP リクエストメソッド アクション
GET 使用可能なワークフローインスタンスとその状態(RUNNINGSUSPENDEDABORTED または COMPLETED)を一覧表示します。

ID によるワークフローインスタンスの管理

以下の HTTP リクエストメソッドが、次の URL に適用されます。

http://localhost:4502/etc/workflow/instances/{id}

HTTP リクエストメソッド アクション
GET それぞれのワークフローモデルへのリンクを含むインスタンスデータ(定義とメタデータ)を取得します。
POST インスタンスの状態を変更します。新しい状態がパラメーター state として送信されます。状態は、RUNNINGSUSPENDED またはABORTED のいずれかである必要があります。
新しい状態にアクセスできない場合(強制終了したインスタンスを休止にするなど)は、409CONFLICT)の応答がクライアントに返されます。

ワークフローモデルの管理

以下の HTTP リクエストメソッドが、次の URL に適用されます。

http://localhost:4502/etc/workflow/models

HTTP リクエストメソッド アクション
GET 使用可能なワークフローモデルを一覧表示します。
POST 新しいワークフローモデルを作成します。パラメーター title を送信すると、指定されたタイトルで新しいモデルが作成されます。JSON モデル定義をパラメーター model として付加すると、指定された定義に応じて新しいワークフローモデルが作成されます。
新しいワークフローモデルリソースの URL を格納したロケーションヘッダーを持つ 201 の応答(CREATED)が返されます。
モデル定義を modelfile というファイルパラメーターとして付加した場合も同じことが起こります。
model パラメーターと modelfile パラメーターのどちらの場合も、シリアル化フォーマットを定義するには、type という追加パラメーターが必要です。新しいシリアル化フォーマットは、OSGI API を使用して統合できます。標準の JSON シリアライザーは、ワークフローエンジンに付属しています。そのタイプは JSON です。フォーマットの例は、以下を参照してください。

例:ブラウザーで http://localhost:4502/etc/workflow/models.json へのリクエストをおこなうと、次のような JSON 応答が生成されます。

[
    {"uri":"/etc/workflow/models/dam/adddamsize/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/ac-newsletter-workflow-simple/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/dam/dam-create-language-copy/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/dam/dam-create-and-translate-language-copy/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/dam-indesign-proxy/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/dam-xmp-writeback/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/dam-parse-word-documents/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/dam/dam_set_last_modified/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/dam/dam-autotag-assets/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/dam/update_asset/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/dam/update_asset_offloading/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/dam/dam-update-language-copy/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/dam/update_from_lightbox/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/cloudservices/DTM_bundle_download/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/dam/dam_download_asset/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/dam/dynamic-media-encode-video/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/dam/dynamic-media-video-thumbnail-replacement/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/dam/dynamic-media-video-user-uploaded-thumbnail/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/phonegap/initiate-phonegap-build/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/newsletter_bounce_check/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/projects/photo_shoot_submission/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/projects/product_photo_shoot/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/projects/approval_workflow/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/publish_example/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/publish_to_campaign/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/s7dam/request_to_publish_to_youtube/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/projects/request_copy/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/projects/request_email/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/projects/request_landing_page/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/projects/request_launch/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/request_for_activation/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/request_for_deactivation/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/request_for_deletion/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/request_to_complete_move_operation/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/reverse_replication/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/salesforce-com-export/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/scene7/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/scheduled_activation/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/scheduled_deactivation/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/screens-update-asset/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/test/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/translation/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/s7dam/request_to_remove_from_youtube/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/dps/upload-content/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/wcm-translation/create_language_copy/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/wcm-translation/prepare_translation_project/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/wcm-translation/translate-i18n-dictionary/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/wcm-translation/sync_translation_job/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/wcm-translation/translate-language-copy/jcr:content/model"}
    ,{"uri":"/etc/workflow/models/wcm-translation/update_language_copy/jcr:content/model"}
]

特定のワークフローモデルの管理

以下の HTTP リクエストメソッドが、次の URL に適用されます。

http://localhost:4502{uri}

ここで、{uri} はリポジトリ内のモデルノードへのパスです。

HTTP リクエストメソッド アクション
GET モデル(定義とメタデータ)の HEAD バージョンを取得します。
PUT モデルの HEAD バージョンを更新します(新しいバージョンを作成します)。
モデルの新しいバージョンのすべてのモデル定義を model というパラメーターとして追加する必要があります。さらに、新しいモデルの作成時には type パラメーターが必要で、値は JSON にする必要があります。
POST PUT の場合と同じ動作です。AEM ウィジェットは PUT 操作をサポートしていないので、これが必要になります。
DELETE モデルを削除します。ファイアウォールやプロキシの問題を解決するために、値が DELETEX-HTTP-Method-Override ヘッダーエントリを格納した POSTDELETE リクエストとして受け入れられます。

例:ブラウザーで http://localhost:4502/etc/workflow/models/publish_example.-1.json へのリクエストをおこなうと、次のコードのような json 応答が返されます。

{
  "jcr:primaryType":"cq:Page",
  "jcr:createdBy":"admin",
  "jcr:created":"Wed Mar 08 2017 14:44:00 GMT+0100",
  "jcr:content":
  {
    "jcr:primaryType":"cq:PageContent",
    "jcr:createdBy":"admin",
    "jcr:title":"Publish Example",
    "cq:template":"/libs/cq/workflow/templates/model",
    "jcr:created":"Wed Mar 08 2017 14:44:00 GMT+0100",
    "multiResourceSupport":"true",
    "jcr:description":"This example shows a simple review and publish process.",
    "cq:tags":["workflow:wcm"],
    "sling:resourceType":"cq/workflow/components/pages/model",
    "flow":
    {
      "jcr:primaryType":"nt:unstructured",
      "sling:resourceType":"foundation/components/parsys",
      "participant":
      {
        "jcr:primaryType":"nt:unstructured",
        "jcr:title":"Validate Content",
        "jcr:description":"Validate the modified content.",
        "sling:resourceType":"cq/workflow/components/model/participant",
        "metaData":
        {
          "jcr:primaryType":"nt:unstructured",
          "PARTICIPANT":"admin"
        }
      },
      "process":
      {
        "jcr:primaryType":
        "nt:unstructured",
        "jcr:title":"Publish Content",
        "jcr:description":"Publish the modified content.",
        "sling:resourceType":"cq/workflow/components/model/process",
        "metaData":
        {
          "jcr:primaryType":"nt:unstructured",
          "PROCESS":"com.day.cq.wcm.workflow.process.ActivatePageProcess",
          "PROCESS_AUTO_ADVANCE":"true"
        }
      }
    },
    "model":
    {
      "jcr:primaryType":"cq:WorkflowModel",
      "description":"This example shows a simple review and publish process.",
      "jcr:versionHistory":"3977d5cd-c375-4fa5-a46e-973f44ade83d",
      "jcr:predecessors":[],
      "title":"Publish Example",
      "jcr:baseVersion":"c7706b62-dece-4430-b8d0-f767046a3d74",
      "jcr:isCheckedOut":false,
      "jcr:uuid":"638bdbe2-c554-4e4d-bf8a-d76737d6825c",
      "sling:resourceType":"cq/workflow/components/model",
      "metaData":
      {
        "jcr:primaryType":"nt:unstructured",
        "tags":"wcm,publish"
      },
      "nodes":
      {
        "jcr:primaryType":"nt:unstructured",
        "node0":
        {
          "jcr:primaryType":"cq:WorkflowNode",
          "description":"The start node of the workflow.",
          "type":"START",
          "title":"Start",
          "metaData":
          {
            "jcr:primaryType":"nt:unstructured"
          }
        },
        "node1":
        {
          "jcr:primaryType":"cq:WorkflowNode",
          "description":"Validate the modified content.",
          "type":"PARTICIPANT",
          "title":"Validate Content",
          "metaData":
          {
            "jcr:primaryType":"nt:unstructured",
            "PARTICIPANT":"admin"
          }
        },
        "node2":
        {
          "jcr:primaryType":"cq:WorkflowNode",
          "description":"Publish the modified content.",
          "type":"PROCESS",
          "title":"Publish Content",
          "metaData":
          {
            "jcr:primaryType":"nt:unstructured",
            "PROCESS":"com.day.cq.wcm.workflow.process.ActivatePageProcess",
            "PROCESS_AUTO_ADVANCE":"true"
          }
        },
        "node3":
        {
          "jcr:primaryType":"cq:WorkflowNode",
          "description":"The end node of the workflow.",
          "type":"END",
          "title":"End",
          "metaData":
          {
            "jcr:primaryType":"nt:unstructured"
          }
        }
      },
      "transitions":
      {
        "jcr:primaryType":"nt:unstructured",
        "node0#node1":
        {
          "jcr:primaryType":"cq:WorkflowTransition",
          "to":"node1",
          "from":"node0",
          "metaData":
          {
            "jcr:primaryType":"nt:unstructured"
          }
        },
        "node1#node2":
        {
          "jcr:primaryType":"cq:WorkflowTransition",
          "to":"node2",
          "from":"node1",
          "metaData":
          {
            "jcr:primaryType":"nt:unstructured"
          }
        },
        "node2#node3":
        {
          "jcr:primaryType":"cq:WorkflowTransition",
          "to":"node3",
          "from":"node2",
          "metaData":
          {
            "jcr:primaryType":"nt:unstructured"
          }
        }
      }
    }
  }
}

バージョンによるワークフローモデルの管理

以下の HTTP リクエストメソッドが、次の URL に適用されます。

http://localhost:4502/etc/workflow/models/{id}.{version}

HTTP リクエストメソッド アクション
GET 指定されたバージョンのモデルのデータを取得します(存在する場合)。

(ユーザーの)インボックスの管理

以下の HTTP リクエストメソッドが、次の URL に適用されます。

http://localhost:4502/bin/workflow/inbox

HTTP リクエストメソッド アクション
GET ユーザーのインボックスにある作業項目を一覧表示します。ユーザーは、HTTP 認証ヘッダーによって識別されます。
POST URI がパラメーター item として送信される作業項目を完了し、一致するワークフローインスタンスを次のノードに進めます。次のノードは、パラメーター route(1 ステップ戻る場合はパラメーター backroute)によって定義されます。
パラメーター delegatee を送信した場合は、パラメーター item によって識別される作業項目が、指定された参加者に委任されます。

WorkItem ID による(ユーザーの)インボックスの管理

以下の HTTP リクエストメソッドが、次の URL に適用されます。

http://localhost:4502/bin/workflow/inbox/{id}

HTTP リクエストメソッド アクション
GET ID によって識別されるインボックスの WorkItem のデータ(定義とメタデータ)を取得します。

実行中のすべてのワークフローとその ID のリストを取得する方法

実行中のすべてのワークフローのリストを取得するには、次の URL に対して GET を実行します。

http://localhost:4502/etc/workflow/instances.RUNNING.json

実行中のすべてのワークフローとその ID のリストを取得する方法 - curl を使用した REST

curl を使用した例:

curl -u admin:admin http://localhost:4502/etc/workflow/instances.RUNNING.json

結果に表示される uri は、他のコマンドでインスタンス id として使用できます。その例を以下に示します。

[
    {"uri":"/etc/workflow/instances/server0/2017-03-08/request_for_activation_1"}
]

注意:

この curl コマンドは、RUNNING を任意のワークフローの状態に置き換えて使用できます。

ワークフローのタイトルを変更する方法

ワークフローコンソールの「インスタンス」タブに表示されているワークフローのタイトルを変更するには、次のように POST コマンドを送信します。

  • URL:http://localhost:4502/etc/workflow/instances/{id}
  • 使用するパラメーター:
    • action:値は必ず UPDATE にします。
    • workflowTitle:ワークフローのタイトル

ワークフローのタイトルを変更する方法 - curl を使用した REST

curl を使用した例:

curl -u admin:admin -d "action=UPDATE&workflowTitle=myWorkflowTitle" http://localhost:4502/etc/workflow/instances/{id}

# for example
curl -u admin:admin -d "action=UPDATE&workflowTitle=myWorkflowTitle" http://localhost:4502/etc/workflow/instances/server0/2017-03-08/request_for_activation_1

すべてのワークフローモデルを一覧表示する方法

使用可能なすべてのワークフローモデルのリストを取得するには、次の URL に対して GET を実行します。

http://localhost:4502/etc/workflow/models.json

すべてのワークフローモデルを一覧表示する方法 - curl を使用した REST

curl を使用した例:

curl -u admin:admin http://localhost:4502/etc/workflow/models.json

注意:

ワークフローモデルの管理も参照してください。

WorkflowSession オブジェクトの取得

com.adobe.granite.workflow.WorkflowSession クラスは、javax.jcr.Session オブジェクトまたは org.apache.sling.api.resource.ResourceResolver オブジェクトから適応させることができます。

WorkflowSession オブジェクトの取得 - Java

JSP スクリプト(またはサーブレットクラスの Java コード)で、HTTP リクエストオブジェクトを使用して SlingHttpServletRequest オブジェクトを取得します。これにより、ResourceResolver オブジェクトへのアクセスが可能になります。ResourceResolver オブジェクトを WorkflowSession に適応させます。

<%
%><%@include file="/libs/foundation/global.jsp"%><%
%><%@page session="false" 
    import="com.adobe.granite.workflow.WorkflowSession,
		org.apache.sling.api.SlingHttpServletRequest"%><%

SlingHttpServletRequest slingReq = (SlingHttpServletRequest)request;
WorkflowSession wfSession = slingReq.getResourceResolver().adaptTo(WorkflowSession.class);
%>

WorkflowSession オブジェクトの取得 - ECMA スクリプト

sling 変数を使用して、ResourceResolver オブジェクトの取得に使用する SlingHttpServletRequest オブジェクトを取得します。ResourceResolver オブジェクトを WorkflowSession オブジェクトに適応させます。

var wfsession = sling.getRequest().getResource().getResourceResolver().adaptTo(Packages.com.adobe.granite.workflow.WorkflowSession);

ワークフローモデルの作成、読み取り、削除

以下の例では、ワークフローモデルにアクセスする方法を説明しています。

  • Java および ECMA スクリプトコードは、WorkflowSession.createNewModel メソッドを使用します。
  • curl コマンドは、モデルの URL を使用してモデルに直接アクセスします。

例では以下を実行します。

  1. モデル(ID /etc/workflow/models/mymodel/jcr:content/model)を作成します。
  2. モデルを削除します。

注意:

モデルを削除すると、モデルの metaData 子ノードの deleted プロパティが true に設定されます。

モデルを削除しても、モデルノードは削除されません。

新しいモデルを作成する場合:

  • ワークフローモデルエディターでは、モデルが /etc/workflow/models の下で特定のノード構造を使用している必要があります。モデルの親ノードは、次のプロパティ値の jcr:content ノードを持つ cq:Page タイプである必要があります。

    • sling:resourceTypecq/workflow/components/pages/model
    • cq:template/libs/cq/workflow/templates/model 

    モデルを作成する際は、まずこの cq:Page ノードを作成し、その jcr:content ノードを model ノードの親として使用する必要があります。

  • 一部のメソッドがモデルの識別に必要とする id 引数は、リポジトリ内の model ノードの絶対パスです。

    /etc/workflow/models/<model_name>/jcr:content/model

ワークフローモデルの作成、読み取り、削除 - Java

<%@include file="/libs/foundation/global.jsp"%><%
%><%@page session="false" import="com.adobe.granite.workflow.WorkflowSession,
    		           com.adobe.granite.workflow.model.WorkflowModel,
		           org.apache.sling.api.SlingHttpServletRequest"%><%

SlingHttpServletRequest slingReq = (SlingHttpServletRequest)request;
WorkflowSession wfSession = slingReq.getResourceResolver().adaptTo(WorkflowSession.class);
/* Create the parent page */
String modelRepo = new String("/etc/workflow/models");
String modelTemplate = new String ("/libs/cq/workflow/templates/model");
String modelName = new String("mymodel");
Page modelParent = pageManager.create(modelRepo, modelName, modelTemplate, "My workflow model");

/* create the model */
String modelId = new String(modelParent.getPath()+"/jcr:content/model")
WorkflowModel model = wfSession.createNewModel("Made using Java",modelId);

/* delete the model */
wfSession.deleteModel(modelId);
%>

ワークフローモデルの作成、読み取り、削除 - ECMA スクリプト

var resolver = sling.getRequest().getResource().getResourceResolver();
var wfSession = resolver.adaptTo(Packages.com.adobe.granite.workflow.WorkflowSession);
var pageManager = resolver.adaptTo(Packages.com.day.cq.wcm.api.PageManager);

//create the parent page node
var workflowPage = pageManager.create("/etc/workflow/models", "mymodel", "/libs/cq/workflow/templates/model", "Created via ECMA Script");
var modelId = workflowPage.getPath()+ "/jcr:content/model";
//create the model
var model = wfSession.createNewModel("My Model", modelId);
//delete the model
var model = wfSession.deleteModel(modelId);

ワークフローモデルの削除 - curl を使用した REST

# deleting the model by its id
curl -u admin:admin -X DELETE http://localhost:4502/etc/workflow/models/{id}

注意:

必要な詳細のレベルを考慮した結果、curl はモデルの作成や読み取りに使用できないと見なされています。

ワークフローの状態の確認時のシステムワークフローの除外

WorkflowStatus API を使用して、ノードのワークフローの状態に関する情報を取得できます。

各種メソッドには次のパラメーターがあります。

excludeSystemWorkflows

このパラメーターを true に設定すると、適切な結果からシステムワークフローを除外することができます。

Models ワークフローがシステムワークフローであると見なされるように指定する Adobe Granite Workflow PayloadMapCache という OSGi 設定を更新できます。デフォルトのワークフローモデルを以下に示します。

  • /etc/workflow/models/scheduled_activation/jcr:content/model
  • /etc/workflow/models/scheduled_deactivation/jcr:content/model

タイムアウト後に参加者ステップを自動的に進める

事前定義した時間内に終了しなかった参加者ステップを自動的に進める必要がある場合は、以下の手順を実行します。

  1. OSGI イベントリスナーを実装して、タスクの作成と変更をリスンします。
  2. タイムアウト(期限)を指定し、その時点で実行されるようにスケジュールされた sling ジョブを作成します。
  3. タイムアウトになり、ジョブが実行されるときに通知されるジョブハンドラーを作成します。
    このハンドラーは、タスクがまだ完了していない場合に、タスクに対して必要なアクションを実行します。

注意:

実行するアクションは、この手法を使用できるよう明確に定義されている必要があります。

ワークフローインスタンスとのやり取り

(プログラムによって)ワークフローインスタンスとやり取りする方法について、以下に基本的な例を示します。

ワークフローインスタンスとのやり取り - Java

// starting a workflow
WorkflowModel model = wfSession.getModel(workflowId);
WorkflowData wfData = wfSession.newWorkflowData("JCR_PATH", repoPath);
wfSession.startWorkflow(model, wfData);

// querying and managing a workflow
Workflow[] workflows workflows = wfSession.getAllWorkflows();
Workflow workflow= wfSession.getWorkflow(id);
wfSession.suspendWorkflow(workflow);
wfSession.resumeWorkflow(workflow);
wfSession.terminateWorkflow(workflow);

ワークフローインスタンスとのやり取り - ECMA スクリプト

// starting a workflow
var model = wfSession.getModel(workflowId);
var wfData = wfSession.newWorkflowData("JCR_PATH", repoPath);
wfSession.startWorkflow(model, wfData);

// querying and managing a workflow
var workflows = wfSession.getWorkflows(“RUNNING“);
var workflow= wfSession.getWorkflow(id);
wfSession.suspendWorkflow(workflow);
wfSession.resumeWorkflow(workflow);
wfSession.terminateWorkflow(workflow);

ワークフローインスタンスとのやり取り - curl を使用した REST

  • ワークフローの開始 

    # starting a workflow
    curl -d "model={id}&payloadType={type}&payload={payload}" http://localhost:4502/etc/workflow/instances
    
    # for example:
    curl -u admin:admin -d "model=/etc/workflow/models/request_for_activation/jcr:content/model&payloadType=JCR_PATH&payload=/content/we-retail/us/en/products" httalhost:4502/etc/workflow/instances
  • インスタンスの一覧表示

    # listing the instances
    curl -u admin:admin http://localhost:4502/etc/workflow/instances.json

    これにより、すべてのインスタンスが一覧表示されます。以下に例を示します。

    [
        {"uri":"/etc/workflow/instances/server0/2017-03-09/request_for_activation_1"}
        ,{"uri":"/etc/workflow/instances/server0/2017-03-08/request_for_activation_1"}
    ]

    注意:

    特定の状態のインスタンスを一覧表示する方法については、実行中のすべてのワークフローとその ID のリストを取得する方法を参照してください。

  • ワークフローの休止

    # suspending a workflow
    curl -d "state=SUSPENDED" http://localhost:4502/etc/workflow/instances/{id}
    
    # for example:
    curl -u admin:admin -d "state=SUSPENDED" http://localhost:4502/etc/workflow/instances/server0/2017-03-08/request_for_activation_1
    
  • ワークフローの再開

    # resuming a workflow
    curl -d "state=RUNNING" http://localhost:4502/etc/workflow/instances/{id}
    
    # for example:
    curl -u admin:admin -d "state=RUNNING" http://localhost:4502/etc/workflow/instances/server0/2017-03-08/request_for_activation_1
    
  • ワークフローインスタンスの終了

    # terminating a workflow
    curl -d "state=ABORTED" http://localhost:4502/etc/workflow/instances/{id}
    
    # for example:
    curl -u admin:admin -d "state=ABORTED" http://localhost:4502/etc/workflow/instances/server0/2017-03-08/request_for_activation_1

作業項目とのやり取り

(プログラムによって)作業項目とやり取りする方法について、以下に基本的な例を示します。

作業項目とのやり取り - Java

// querying work items
WorkItem[] workItems = wfSession.getActiveWorkItems();
WorkItem workItem = wfSession.getWorkItem(id);

// getting routes
List<Route> routes = wfSession.getRoutes(workItem);

// delegating
List<Authorizable> delegatees = wfSession.getDelegatees(workItem);
wfSession.delegateWorkItem(workItem, delegatees.get(0));

// completing or advancing to the next step
wfSession.complete(workItem, routes.get(0));

作業項目とのやり取り - ECMA スクリプト

// querying work items
var workItems = wfSession.getActiveWorkItems();
var workItem = wfSession.getWorkItem(id);

// getting routes
var routes = wfSession.getRoutes(workItem);

// delegating
var delegatees = wfSession.getDelegatees(workItem);
wfSession.delegateWorkItem(workItem, delegatees.get(0));

// completing or advancing to the next step
wfSession.complete(workItem, routes.get(0));

作業項目とのやり取り - curl を使用した REST

  • インボックスの作業項目の一覧表示

    # listing the work items
    curl -u admin:admin http://localhost:4502/bin/workflow/inbox
    

    現在インボックス内にある作業項目の詳細が一覧表示されます。以下に例を示します。

    [
      {
        "uri_xss": "/etc/workflow/instances/server0/2017-03-08/request_for_activation_1/workItems/node1_etc_workflow_instances_server0_2017-03-08_request_for_activation_1",
        "uri": "/etc/workflow/instances/server0/2017-03-08/request_for_activation_1/workItems/node1_etc_workflow_instances_server0_2017-03-08_request_for_activation_1",
        "currentAssignee_xss": "administrators",
        "currentAssignee": "administrators",
        "startTime": 1488980960111,
        "payloadType_xss": "JCR_PATH",
        "payloadType": "JCR_PATH",
        "payload_xss": "/content/we-retail/us/en/products",
        "payload": "/content/we-retail/us/en/products",
        "type_xss": "WorkItem",
        "type": "WorkItem"
      },{
        "uri_xss": "configuration/securitychecklist",
        "uri": "configuration/securitychecklist",
        "currentAssignee_xss": "administrators",
        "currentAssignee": "administrators",
        "type_xss": "Task",
        "type": "Task"
      }
    ]
  • 作業項目の委任

    # delegating
    curl -d "item={item}&delegatee={delegatee}" http://localhost:4502/bin/workflow/inbox
    
    # for example: 
    curl -u admin:admin -d "item=/etc/workflow/instances/server0/2017-03-08/request_for_activation_1/workItems/node1_etc_workflow_instances_server0_2017-03-08_request_for_act_1&delegatee=administrators" http://localhost:4502/bin/workflow/inbox

    注意:

    delegatee は、ワークフローステップに有効なオプションである必要があります。

  • 作業項目を完了する、または次のステップに進める

    # retrieve the list of routes; the results will be similar to {"results":1,"routes":[{"rid":"233123169","label":"End","label_xss":"End"}]}
    http://localhost:4502/etc/workflow/instances/<path-to-the-workitem>.routes.json
    
    # completing or advancing to the next step; use the appropriate route ID (rid value) from the above list
    curl -d "item={item}&route={route}" http://localhost:4502/bin/workflow/inbox
    
    # for example:
    curl -u admin:admin -d "item=/etc/workflow/instances/server0/2017-03-08/request_for_activation_1/workItems/node1_etc_workflow_instances_server0_2017-03-08_request_for_activation_1&route=233123169" http://localhost:4502/bin/workflow/inbox

ワークフローイベントのリスン

OSGi イベントフレームワークを使用して、com.adobe.granite.workflow.event.WorkflowEvent クラスが定義するイベントをリスンします。このクラスは、イベントの対象に関する情報を取得するのに役立ついくつかのメソッドも提供します。例えば、getWorkItem メソッドは、イベントに関与する作業項目の WorkItem オブジェクトを返します。

次のサンプルコードでは、ワークフローイベントをリスンし、イベントのタイプに応じてタスクを実行するサービスを定義しています。

package com.adobe.example.workflow.listeners;

import org.apache.sling.event.jobs.JobProcessor;
import org.apache.sling.event.jobs.JobUtil;

import org.osgi.service.event.Event;
import org.osgi.service.event.EventHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Service;

import com.adobe.granite.workflow.event.WorkflowEvent;
import com.adobe.granite.workflow.exec.WorkItem;

/**
 * The <code>WorkflowEventCatcher</code> class listens to workflow events. 
 */
@Component(metatype=false, immediate=true)
@Service(value=org.osgi.service.event.EventHandler.class)
public class WorkflowEventCatcher implements EventHandler, JobProcessor {

	@Property(value=com.adobe.granite.workflow.event.WorkflowEvent.EVENT_TOPIC)
	static final String EVENT_TOPICS = "event.topics";

	private static final Logger logger = LoggerFactory.getLogger(WorkflowEventCatcher.class);

	public void handleEvent(Event event) {
		JobUtil.processJob(event, this);
	}

	public boolean process(Event event) {
		logger.info("Received event of topic: " + event.getTopic());
		String topic = event.getTopic();

		try {
			if (topic.equals(WorkflowEvent.EVENT_TOPIC)) {
				WorkflowEvent wfevent = (WorkflowEvent)event;
				String eventType = wfevent.getEventType();
				String instanceId = wfevent.getWorkflowInstanceId();

				if (instanceId != null) {
					//workflow instance events
					if (eventType.equals(WorkflowEvent.WORKFLOW_STARTED_EVENT) ||
							eventType.equals(WorkflowEvent.WORKFLOW_RESUMED_EVENT) ||
							eventType.equals(WorkflowEvent.WORKFLOW_SUSPENDED_EVENT)) {
						// your code comes here...
					} else if (
							eventType.equals(WorkflowEvent.WORKFLOW_ABORTED_EVENT) ||
							eventType.equals(WorkflowEvent.WORKFLOW_COMPLETED_EVENT)) {
						// your code comes here...
					}
					// workflow node event
					if (eventType.equals(WorkflowEvent.NODE_TRANSITION_EVENT)) {
						WorkItem currentItem = (WorkItem) event.getProperty(WorkflowEvent.WORK_ITEM);
						// your code comes here...
					}
				}
			}
		} catch(Exception e){
			logger.debug(e.getMessage());
			e.printStackTrace();
		}
		return true;
	}
}

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

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