In AEM, workflows instances can be managed (complete, send back, terminate etc) either from AEM inbox or from workflow console.
AEM Inbox
http://localhost:4502/aem/inbox
AEM Workflow - Instance Page
http://localhost:4502/libs/cq/workflow/admin/console/content/instances.html
Sometimes there are cases when workflows need to manage programmatically. This can be done using various AEM workflow JAVA API, available within below packages.
com.adobe.granite.workflow.model
com.adobe.granite.workflow.exec
com.day.cq.workflow.model
com.day.cq.workflow.exec
The alternative is to create a custom solution to retry workflow
curl -u admin:admin \
-H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \
--data "cmd=advance" \
--data "item=${WORKFLOW_ITEM_ENCODED}" \
--data "route-${WORKFLOW_ITEM_ENCODED}=retry-current-step" \
--data "comment-${WORKFLOW_ITEM_ENCODED}=retry by curl"
where ${WORKFLOW_ITEM} variable contains the current workflow item path.
e.g.
/var/workflow/instances/server0/2019-07-28/request_copy_2/workItems/node1_var_workflow_instances_server0_2019-07-28_request_copy_2
Complete Curl code at
https://github.com/arunpatidar02/aem63app-repo/blob/master/java/workflow/retry-wf.sh
Where,
wfSession: WorkflowSession from the current session
workflowItemPath: Current item path as shown in the above screenshot
workflowItem: Current workflow item of the above path
param: Map, contains workflow item's metadata properties in key-value pair like comment etc.
The second method uses the sub-service session, so make sure service user has rights to perform read/write and other operation in the repository.
String workflowItemPath = "/var/workflow/instances/server0/2019-07-28/request_copy_2/workItems/node1_var_workflow_instances_server0_2019-07-28_request_copy_2";
Map<String, String> params = new HashMap<String, String>();
params.put("comment", "comment - retrying");
WorkflowSession wfSession = (WorkflowSession)req.getResourceResolver().adaptTo(WorkflowSession.class);
WorkItem workflowItem;
try {
workflowItem = wfSession.getWorkItem(workflowItemPath);
wrs.retryWorkflow(wfSession, workflowItem, params);
// wrs.retryWorkflow(workflowItemPath, params);
}
catch (WorkflowException e) {
e.printStackTrace();
}
https://github.com/arunpatidar02/aem63app-repo/blob/master/java/WorkflowRetryDemoServlet.java
AEM Inbox
http://localhost:4502/aem/inbox
AEM Workflow - Instance Page
http://localhost:4502/libs/cq/workflow/admin/console/content/instances.html
Sometimes there are cases when workflows need to manage programmatically. This can be done using various AEM workflow JAVA API, available within below packages.
Granite API
com.adobe.granite.workflowcom.adobe.granite.workflow.model
com.adobe.granite.workflow.exec
CQ API (old)
com.day.cq.workflowcom.day.cq.workflow.model
com.day.cq.workflow.exec
But None of the API have option to retry failed workflow.
AEM inbox |
The alternative is to create a custom solution to retry workflow
Retry Workflow using Curl
WORKFLOW_ITEM_ENCODED="$(uriencode ${WORKFLOW_ITEM})"curl -u admin:admin \
-H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \
--data "cmd=advance" \
--data "item=${WORKFLOW_ITEM_ENCODED}" \
--data "route-${WORKFLOW_ITEM_ENCODED}=retry-current-step" \
--data "comment-${WORKFLOW_ITEM_ENCODED}=retry by curl"
where ${WORKFLOW_ITEM} variable contains the current workflow item path.
e.g.
/var/workflow/instances/server0/2019-07-28/request_copy_2/workItems/node1_var_workflow_instances_server0_2019-07-28_request_copy_2
Complete Curl code at
https://github.com/arunpatidar02/aem63app-repo/blob/master/java/workflow/retry-wf.sh
Retry Workflow using JAVA
In code, you may need to retry workflow from a servlet or any other services or components.
I created an OSGi component, which provides methods to retry a failed workflow item.
You need to add below code files available from GitHub
https://github.com/arunpatidar02/aem63app-repo/tree/master/java/workflow/com/acc/aem64/core/services
This WorkflowRetryService interface contains 2 methods
public void retryWorkflow(WorkflowSession wfSession, WorkItem workflowItem, Map<String, String> param);
public void retryWorkflow(String workflowItemPath, Map<String, String> param);
I created an OSGi component, which provides methods to retry a failed workflow item.
You need to add below code files available from GitHub
https://github.com/arunpatidar02/aem63app-repo/tree/master/java/workflow/com/acc/aem64/core/services
This WorkflowRetryService interface contains 2 methods
public void retryWorkflow(WorkflowSession wfSession, WorkItem workflowItem, Map<String, String> param);
public void retryWorkflow(String workflowItemPath, Map<String, String> param);
Where,
wfSession: WorkflowSession from the current session
workflowItemPath: Current item path as shown in the above screenshot
workflowItem: Current workflow item of the above path
param: Map, contains workflow item's metadata properties in key-value pair like comment etc.
The second method uses the sub-service session, so make sure service user has rights to perform read/write and other operation in the repository.
Example Servlet
This servlet is used to retry workflow using JavaString workflowItemPath = "/var/workflow/instances/server0/2019-07-28/request_copy_2/workItems/node1_var_workflow_instances_server0_2019-07-28_request_copy_2";
Map<String, String> params = new HashMap<String, String>();
params.put("comment", "comment - retrying");
WorkflowSession wfSession = (WorkflowSession)req.getResourceResolver().adaptTo(WorkflowSession.class);
WorkItem workflowItem;
try {
workflowItem = wfSession.getWorkItem(workflowItemPath);
wrs.retryWorkflow(wfSession, workflowItem, params);
// wrs.retryWorkflow(workflowItemPath, params);
}
catch (WorkflowException e) {
e.printStackTrace();
}
https://github.com/arunpatidar02/aem63app-repo/blob/master/java/WorkflowRetryDemoServlet.java
No comments:
Post a Comment