ワークフローをカスタマイズおよび拡張する際は、以下の方法でワークフローオブジェクトにアクセスできます。
ワークフロー Java API は、com.adobe.granite.workflow パッケージといくつかのサブパッケージで構成されます。この API の最も重要な構成要素は、com.adobe.granite.workflow.WorkflowSession クラスです。WorkflowSession クラスは、デザイン時と実行時に、次のワークフローオブジェクトへのアクセスを可能にします。
- ワークフローモデル
- 作業項目
- ワークフローインスタンス
- ワークフローデータ
- インボックス項目
このクラスは、ワークフローのライフサイクルに介入するためのメソッドもいくつか提供します。
以下の表に、プログラムによってワークフローとやり取りする際に使用するいくつかの重要な Java オブジェクトの参照ドキュメントへのリンクを示します。以降の例では、コード内でクラスオブジェクトを取得および使用する方法を示します。
機能 | オブジェクト |
---|---|
ワークフローへのアクセス | WorkflowSession |
ワークフローインスタンスの実行とクエリ | Workflow WorkItem WorkflowData |
ワークフローモデルの管理 | WorkflowModel WorkflowNode WorkflowTransition |
ワークフロー内にある(またはワークフロー内にない)ノードの情報 | WorkflowStatus |
スクリプトの設置で説明したように、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);
注意:
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 リクエストメソッド | アクション |
GET | 使用可能なワークフローインスタンスを一覧表示します。 |
POST | 新しいワークフローインスタンスを作成します。パラメーターを以下に示します。 |
HTTP リクエストメソッド | アクション |
GET | それぞれのワークフローモデルへのリンクを含むインスタンスデータ(定義とメタデータ)を取得します。 |
POST | インスタンスの状態を変更します。新しい状態がパラメーター state として送信されます。状態は、RUNNING、SUSPENDED またはABORTED のいずれかである必要があります。 新しい状態にアクセスできない場合(強制終了したインスタンスを休止にするなど)は、409(CONFLICT)の応答がクライアントに返されます。 |
HTTP リクエストメソッド | アクション |
GET | 使用可能なワークフローモデルを一覧表示します。 |
POST | 新しいワークフローモデルを作成します。パラメーター title を送信すると、指定されたタイトルで新しいモデルが作成されます。JSON モデル定義をパラメーター model として付加すると、指定された定義に応じて新しいワークフローモデルが作成されます。 新しいワークフローモデルリソースの URL を格納したロケーションヘッダーを持つ 201 の応答(CREATED)が返されます。 モデル定義を modelfile というファイルパラメーターとして付加した場合も同じことが起こります。 model パラメーターと modelfile パラメーターのどちらの場合も、シリアル化フォーマットを定義するには、type という追加パラメーターが必要です。新しいシリアル化フォーマットは、OSGI API を使用して統合できます。標準の 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 リクエストメソッド | アクション |
GET | モデル(定義とメタデータ)の HEAD バージョンを取得します。 |
PUT | モデルの HEAD バージョンを更新します(新しいバージョンを作成します)。 モデルの新しいバージョンのすべてのモデル定義を model というパラメーターとして追加する必要があります。さらに、新しいモデルの作成時には type パラメーターが必要で、値は JSON にする必要があります。 |
POST | PUT の場合と同じ動作です。AEM ウィジェットは PUT 操作をサポートしていないので、これが必要になります。 |
DELETE | モデルを削除します。ファイアウォールやプロキシの問題を解決するために、値が DELETE の X-HTTP-Method-Override ヘッダーエントリを格納した POST も DELETE リクエストとして受け入れられます。 |
例:ブラウザーで 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 リクエストメソッド | アクション |
GET | ユーザーのインボックスにある作業項目を一覧表示します。ユーザーは、HTTP 認証ヘッダーによって識別されます。 |
POST | URI がパラメーター item として送信される作業項目を完了し、一致するワークフローインスタンスを次のノードに進めます。次のノードは、パラメーター route(1 ステップ戻る場合はパラメーター backroute)によって定義されます。 パラメーター delegatee を送信した場合は、パラメーター item によって識別される作業項目が、指定された参加者に委任されます。 |
実行中のすべてのワークフローのリストを取得するには、次の URL に対して GET を実行します。
http://localhost:4502/etc/workflow/instances.RUNNING.json
curl -u admin:admin http://localhost:4502/etc/workflow/instances.RUNNING.json
[ {"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:ワークフローのタイトル
- action:値は必ず UPDATE にします。
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 -u admin:admin http://localhost:4502/etc/workflow/models.json
注意:
ワークフローモデルの管理も参照してください。
com.adobe.granite.workflow.WorkflowSession クラスは、javax.jcr.Session オブジェクトまたは org.apache.sling.api.resource.ResourceResolver オブジェクトから適応させることができます。
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); %>
sling 変数を使用して、ResourceResolver オブジェクトの取得に使用する SlingHttpServletRequest オブジェクトを取得します。ResourceResolver オブジェクトを WorkflowSession オブジェクトに適応させます。
var wfsession = sling.getRequest().getResource().getResourceResolver().adaptTo(Packages.com.adobe.granite.workflow.WorkflowSession);
以下の例では、ワークフローモデルにアクセスする方法を説明しています。
- Java および ECMA スクリプトコードは、WorkflowSession.createNewModel メソッドを使用します。
- curl コマンドは、モデルの URL を使用してモデルに直接アクセスします。
注意:
モデルを削除すると、モデルの metaData 子ノードの deleted プロパティが true に設定されます。
モデルを削除しても、モデルノードは削除されません。
-
ワークフローモデルエディターでは、モデルが /etc/workflow/models の下で特定のノード構造を使用している必要があります。モデルの親ノードは、次のプロパティ値の jcr:content ノードを持つ cq:Page タイプである必要があります。
- sling:resourceType:cq/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
注意:
すべてのワークフローモデルを一覧表示する方法を参照してください。
<%@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); %>
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);
# 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
事前定義した時間内に終了しなかった参加者ステップを自動的に進める必要がある場合は、以下の手順を実行します。
- OSGI イベントリスナーを実装して、タスクの作成と変更をリスンします。
- タイムアウト(期限)を指定し、その時点で実行されるようにスケジュールされた sling ジョブを作成します。
- タイムアウトになり、ジョブが実行されるときに通知されるジョブハンドラーを作成します。
このハンドラーは、タスクがまだ完了していない場合に、タスクに対して必要なアクションを実行します。
注意:
実行するアクションは、この手法を使用できるよう明確に定義されている必要があります。
// 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);
// 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);
-
# 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 のリストを取得する方法を参照してください。
// 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));
// 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));
-
# 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; } }