ワークフローをカスタマイズおよび拡張する際は、以下の方法でワークフローオブジェクトにアクセスできます。
ワークフロー 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);
ワークフローコンソールでは、REST API を大量に利用します。このページでは、ワークフローの REST API について説明します。
curl コマンドラインツールを使用すると、Workflow REST API を使用して、ワークフローオブジェクトにアクセスし、インスタンスのライフサイクルを管理できます。 このページの例では、curl コマンドラインツールから REST API を使用する方法を示します。
REST API では、次のアクションがサポートされています。
Web 開発用の Firefox の拡張機能である Firebug を使用すると、コンソールの操作時に HTTP トラフィックを追跡できます。例えば、POST
リクエストにより AEM サーバーに送信されたパラメーターと値を確認できます。
このページでは、AEMが localhost のポートで実行されていると想定しています。 4502
インストールコンテキストが /
" (ルート)と呼ばれます。 実際のインストール状況が異なる場合は、HTTP リクエストが適用される URI を実際の状況に合わせて変更してください。
GET
リクエストに対応するレンダリングは JSON レンダリングです。の URL GET
が .json
拡張子。例:
http://localhost:4502/etc/workflow.json
以下の HTTP リクエストメソッドが、次の URL に適用されます。
http://localhost:4502/etc/workflow/instances
HTTP リクエストメソッド | アクション |
GET |
使用可能なワークフローインスタンスをリストします。 |
POST |
新しいワークフローインスタンスを作成します。パラメーターを以下に示します。 |
以下の HTTP リクエストメソッドが、次の URL に適用されます。
http://localhost:4502/etc/workflow/instances.{state}
HTTP リクエストメソッド | アクション |
---|---|
GET |
使用可能なワークフローインスタンスとその状態 ( RUNNING , SUSPENDED , ABORTED または COMPLETED ) |
以下の HTTP リクエストメソッドが、次の URL に適用されます。
http://localhost:4502/etc/workflow/instances/{id}
HTTP リクエストメソッド | アクション |
GET |
それぞれのワークフローモデルへのリンクを含むインスタンスデータ(定義とメタデータ)を取得します。 |
POST |
インスタンスの状態を変更します。新しい状態がパラメーターとして送信されます state とは、次のいずれかの値を持つ必要があります。 RUNNING , SUSPENDED または ABORTED .新しい状態にアクセスできない場合(終了したインスタンスを休止する場合など)、 409 (CONFLICT ) 応答がクライアントに送り返されます。 |
以下の HTTP リクエストメソッドが、次の URL に適用されます。
http://localhost:4502/etc/workflow/models
HTTP リクエストメソッド | アクション |
GET |
使用可能なワークフローモデルを一覧表示します。 |
POST |
新しいワークフローモデルを作成します. パラメーター title が送信されると、指定されたタイトルで新しいモデルが作成されます。 JSON モデル定義をパラメーターとして添付する model 指定された定義に従って、新しいワークフローモデルを作成します。A 201 応答 (CREATED ) は、新しいワークフローモデルリソースの URL を含む場所ヘッダーと共に返されます。同じことが、モデル定義が modelfile .どちらの場合も model および modelfile パラメータ、名前を付けた追加パラメータ type シリアル化形式を定義するには、が必要です。 新しいシリアル化フォーマットは、OSGI API を使用して統合できます。標準の JSON シリアライザーは、ワークフローエンジンに付属しています。そのタイプは JSON です。フォーマットの例は、以下を参照してください。 |
例:ブラウザーで、 http://localhost:4502/etc/workflow/models.json
は、次のような json 応答を生成します。
[
{"uri":"/var/workflow/models/activationmodel"}
,{"uri":"/var/workflow/models/dam/adddamsize"}
,{"uri":"/var/workflow/models/cloudconfigs/dtm-reactor/library-download"}
,{"uri":"/var/workflow/models/ac-newsletter-workflow-simple"}
,{"uri":"/var/workflow/models/dam/dam-create-language-copy"}
,{"uri":"/var/workflow/models/dam/dam-create-and-translate-language-copy"}
,{"uri":"/var/workflow/models/dam-indesign-proxy"}
,{"uri":"/var/workflow/models/dam-xmp-writeback"}
,{"uri":"/var/workflow/models/dam-parse-word-documents"}
,{"uri":"/var/workflow/models/dam/process_subasset"}
,{"uri":"/var/workflow/models/dam/dam_set_last_modified"}
,{"uri":"/var/workflow/models/dam/dam-autotag-assets"}
,{"uri":"/var/workflow/models/dam/update_asset"}
,{"uri":"/var/workflow/models/dam/update_asset_offloading"}
,{"uri":"/var/workflow/models/dam/dam-update-language-copy"}
,{"uri":"/var/workflow/models/dam/update_from_lightbox"}
,{"uri":"/var/workflow/models/cloudservices/DTM_bundle_download"}
,{"uri":"/var/workflow/models/dam/dam_download_asset"}
,{"uri":"/var/workflow/models/dam/dynamic-media-encode-video"}
,{"uri":"/var/workflow/models/dam/dynamic-media-video-thumbnail-replacement"}
,{"uri":"/var/workflow/models/dam/dynamic-media-video-user-uploaded-thumbnail"}
,{"uri":"/var/workflow/models/newsletter_bounce_check"}
,{"uri":"/var/workflow/models/projects/photo_shoot_submission"}
,{"uri":"/var/workflow/models/projects/product_photo_shoot"}
,{"uri":"/var/workflow/models/projects/approval_workflow"}
,{"uri":"/var/workflow/models/prototype-01"}
,{"uri":"/var/workflow/models/publish_example"}
,{"uri":"/var/workflow/models/publish_to_campaign"}
,{"uri":"/var/workflow/models/screens/publish_to_author_bin"}
,{"uri":"/var/workflow/models/s7dam/request_to_publish_to_youtube"}
,{"uri":"/var/workflow/models/projects/request_copy"}
,{"uri":"/var/workflow/models/projects/request_email"}
,{"uri":"/var/workflow/models/projects/request_landing_page"}
,{"uri":"/var/workflow/models/projects/request_launch"}
,{"uri":"/var/workflow/models/request_for_activation"}
,{"uri":"/var/workflow/models/request_for_deactivation"}
,{"uri":"/var/workflow/models/request_for_deletion"}
,{"uri":"/var/workflow/models/request_for_deletion_without_deactivation"}
,{"uri":"/var/workflow/models/request_to_complete_move_operation"}
,{"uri":"/var/workflow/models/reverse_replication"}
,{"uri":"/var/workflow/models/salesforce-com-export"}
,{"uri":"/var/workflow/models/scene7"}
,{"uri":"/var/workflow/models/scheduled_activation"}
,{"uri":"/var/workflow/models/scheduled_deactivation"}
,{"uri":"/var/workflow/models/screens/screens-update-asset"}
,{"uri":"/var/workflow/models/translation"}
,{"uri":"/var/workflow/models/s7dam/request_to_remove_from_youtube"}
,{"uri":"/var/workflow/models/wcm-translation/create_language_copy"}
,{"uri":"/var/workflow/models/wcm-translation/prepare_translation_project"}
,{"uri":"/var/workflow/models/wcm-translation/translate-i18n-dictionary"}
,{"uri":"/var/workflow/models/wcm-translation/sync_translation_job"}
,{"uri":"/var/workflow/models/wcm-translation/translate-language-copy"}
,{"uri":"/var/workflow/models/wcm-translation/update_language_copy"}
]
以下の HTTP リクエストメソッドが、次の URL に適用されます。
http://localhost:4502*{uri}*
ここで、 *{uri}*
は、リポジトリ内のモデルノードへのパスです。
HTTP リクエストメソッド | アクション |
GET |
を取得します HEAD モデルのバージョン(定義とメタデータ)。 |
PUT |
を更新します。 HEAD モデルのバージョン(新しいバージョンを作成します)。モデルの新しいバージョンの完全なモデル定義は、という名前のパラメーターとして追加する必要があります。 model . さらに、 type 新しいモデルを作成する際にはパラメーターが必要で、値を持つ必要があります。 JSON . |
POST |
PUT の場合と同じ動作です。AEMウィジェットがサポートされていないので、必要です PUT 操作。 |
DELETE |
モデルを削除します。ファイアウォール/プロキシの問題を解決するには、 POST を含む X-HTTP-Method-Override 値を持つヘッダーエントリ DELETE は、 DELETE リクエスト。 |
例:ブラウザーで、 http://localhost:4502/var/workflow/models/publish_example.json
は json
次のコードに似た応答を返します。
{
"id":"/var/workflow/models/publish_example",
"title":"Publish Example",
"version":"1.0",
"description":"This example shows a simple review and publish process.",
"metaData":
{
"multiResourceSupport":"true",
"tags":"wcm,publish"
},
"nodes":
[{
"id":"node0",
"type":"START",
"title":"Start",
"description":"The start node of the workflow.",
"metaData":
{
}
},
{
"id":"node1",
"type":"PARTICIPANT",
"title":"Validate Content",
"description":"Validate the modified content.",
"metaData":
{
"PARTICIPANT":"admin"
}
},
{
"id":"node2",
"type":"PROCESS",
"title":"Publish Content",
"description":"Publish the modified content.",
"metaData":
{
"PROCESS_AUTO_ADVANCE":"true",
"PROCESS":"com.day.cq.wcm.workflow.process.ActivatePageProcess"
}
},
{
"id":"node3",
"type":"END",
"title":"End",
"description":"The end node of the workflow.",
"metaData":
{
}
}],
"transitions":
[{
"from":"node0",
"to":"node1",
"metaData":
{
}
},
{
"from":"node1",
"to":"node2",
"metaData":
{
}
},
{
"from":"node2",
"to":"node3",
"metaData":
{
}
}
]}
以下の 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 または backroute 一歩下がる時にパラメーター delegatee が送信されると、パラメーターで識別される作業項目が送信されます。 item は指定した参加者に委任されます。 |
以下の HTTP リクエストメソッドが、次の URL に適用されます。
http://localhost:4502/bin/workflow/inbox/{id}
HTTP リクエストメソッド | アクション |
---|---|
GET |
インボックスのデータ(定義とメタデータ)を取得します WorkItem は、ID で識別されます。 |
実行中のすべてのワークフローのリストを取得するには、次の URL に対して GET を実行します。
http://localhost:4502/etc/workflow/instances.RUNNING.json
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
コマンドを送信します。
を: http://localhost:4502/etc/workflow/instances/{id}
使用するパラメーター:
action
:値は次のとおりです。 UPDATE
workflowTitle
:ワークフローのタイトル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 を使用した例:
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
SlingHttpServletRequest
変数を使用して、 オブジェクトの取得に使用する オブジェクトを取得します。ResourceResolver
を適応させる ResourceResolver
オブジェクトを WorkflowSession
オブジェクト。
var wfsession = sling.getRequest().getResource().getResourceResolver().adaptTo(Packages.com.adobe.granite.workflow.WorkflowSession);
以下の例では、ワークフローモデルにアクセスする方法を説明しています。
WorkflowSession.createNewModel
メソッドを使用します。例では以下を実行します。
/var/workflow/models/mymodel/jcr:content/model
) をクリックします。モデルを削除すると、 deleted
モデルの metaData
子ノードから true
.
モデルを削除しても、モデルノードは削除されません。
新しいモデルを作成する場合:
ワークフローモデルエディターでは、モデルが以下の特定のノード構造を使用する必要があります /var/workflow/models
. モデルの親ノードはタイプである必要があります cq:Page
持つ jcr:content
次のプロパティ値を持つノード。
sling:resourceType
: cq/workflow/components/pages/model
cq:template
: /libs/cq/workflow/templates/model
モデルを作成する際は、まずこの cq:Page
ノードを作成し、その jcr:content
ノードを model ノードの親として使用する必要があります。
この id
一部のメソッドでモデルを識別するために必要な引数は、リポジトリ内の model ノードの絶対パスです。
/var/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("/var/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("/var/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
をクリックして、関連する結果からシステムワークフローを除外する必要があることを示します。
あなた OSGi 設定を更新できます。 AdobeGranite ワークフロー PayloadMapCache ワークフローを指定する Models
をシステムワークフローと見なします。 デフォルト(実行時)のワークフローモデルを以下に示します。
/var/workflow/models/scheduled_activation/jcr:content/model
/var/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=/var/workflow/models/request_for_activation&payloadType=JCR_PATH&payload=/content/we-retail/us/en/products" http://localhost:4502/etc/workflow/instances
インスタンスの一覧表示
# listing the instances
curl -u admin:admin http://localhost:4502/etc/workflow/instances.json
これにより、すべてのインスタンスが一覧表示されます。以下に例を示します。
[
{"uri":"/var/workflow/instances/server0/2018-02-26/prototype-01_1"}
,{"uri":"/var/workflow/instances/server0/2018-02-26/prototype-01_2"}
]
詳しくは、 実行中のすべてのワークフローのリストを取得する方法 を使用して、特定のステータスのインスタンスを一覧表示するためのもの。
ワークフローの休止
# 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
(プログラムによって)作業項目とやり取りする方法について、以下に基本的な例を示します。
// querying work items
WorkItem[] workItems = wfSession.getActiveWorkItems();
WorkItem workItem = wfSession.getWorkItem(id);
// getting routes
List<Route> routes = wfSession.getRoutes(workItem);
// delegating
Iterator<Participant> 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": "/var/workflow/instances/server0/2018-02-26/prototype-01_2/workItems/node2_var_workflow_instances_server0_2018-02-26_prototype-01_2",
"uri": "/var/workflow/instances/server0/2018-02-26/prototype-01_2/workItems/node2_var_workflow_instances_server0_2018-02-26_prototype-01_2",
"currentAssignee_xss": "workflow-administrators",
"currentAssignee": "workflow-administrators",
"startTime": 1519656289274,
"payloadType_xss": "JCR_PATH",
"payloadType": "JCR_PATH",
"payload_xss": "/content/we-retail/es/es",
"payload": "/content/we-retail/es/es",
"comment_xss": "Process resource is null",
"comment": "Process resource is null",
"type_xss": "WorkItem",
"type": "WorkItem"
},{
"uri_xss": "configuration/configure_analyticstargeting",
"uri": "configuration/configure_analyticstargeting",
"currentAssignee_xss": "administrators",
"currentAssignee": "administrators",
"type_xss": "Task",
"type": "Task"
},{
"uri_xss": "configuration/securitychecklist",
"uri": "configuration/securitychecklist",
"currentAssignee_xss": "administrators",
"currentAssignee": "administrators",
"type_xss": "Task",
"type": "Task"
},{
"uri_xss": "configuration/enable_collectionofanonymoususagedata",
"uri": "configuration/enable_collectionofanonymoususagedata",
"currentAssignee_xss": "administrators",
"currentAssignee": "administrators",
"type_xss": "Task",
"type": "Task"
},{
"uri_xss": "configuration/configuressl",
"uri": "configuration/configuressl",
"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;
}
}