如何获取控制器中流程实例的ID?
How to get the ID of the process instance in the controller?
我的环境:
Alfresco Share v5.2.d (r134641-b15, Aikau 1.0.101.3, Spring Surf
5.2.d, Spring WebScripts 6.13, Freemarker 2.3.20-alfresco-patched, Rhino 1.7R4-alfresco-patched, Yui 2.9.0-alfresco-20141223)
Alfresco Community v5.2.0 (r134428-b13) schema 10005
当我启动工作流时,我可以分配执行者 - 将参与业务流程的用户列表。我需要获取所有这些用户的列表并在 reviewTask 屏幕中显示此列表。
为了显示这些数据,我有自定义的 FreeMarker 模板。我将从这个模板调用我的 Web 脚本。
为了通过 REST 与存储库交互,我使用 Web 脚本框架 MVC - 执行接收用户列表逻辑的控制器和 JSON 响应的 FreeMarker 模板。
有人向我提供 ,如何实现。但是我遇到了一些问题。
比方说,我启动了业务流程的多个实例。在工作流控制台中,我可以看到以下内容:
id: activiti01 , desc: DESCRIPTION_1 , start date: Sun Mar 12 19:19:09 GST 2017 , def: activiti$activitiParallelReview v1
id: activiti05 , desc: DESCRIPTION_2 , start date: Sun Mar 12 20:11:57 GST 2017 , def: activiti$activitiParallelReview v1
id: activiti38 , desc: DESCRIPTION_3 , start date: Sun Mar 12 20:12:55 GST 2017 , def: activiti$activitiParallelReview v1
因此我有三个ID:
activiti01
activiti05
activiti38
我只能在工作流控制台中使用这些 ID。
如何在控制器中获取这些标识符?
例如,我可以编写一个将由 Activiti 调用的 class 吗?比方说,
public class SomeListener implements TaskListener {
...
@Override
public void notify(DelegateTask task) {
...
String taskId = task.getId();
...
}
}
然后将其附加到某个任务的完成事件并将ID传递给控制器。
这是正确的方法吗?..
如果能提供信息,我将不胜感激。感谢大家。
我写了一个 class 实现了 ExecutionListener
接口。然后在从 mswf:submitParallelReviewTask
到 mswf:activitiReviewTask
.
的过渡中将其添加为侦听器
我需要的所有属性,我都能在这里得到(感谢Gagravarr for his ):
public class PropertiesReceiver implements ExecutionListener {
private static final long serialVersionUID = 1L;
private static Log logger = LogFactory.getLog(PropertiesReceiver.class);
@Override
public void notify(DelegateExecution delegateExecution) throws Exception {
// TODO Auto-generated method stub
String processInstanceId = delegateExecution.getProcessInstanceId();
logger.debug("processInstanceId == " + processInstanceId);
ActivitiScriptNodeList assignees =
(ActivitiScriptNodeList) delegateExecution.getVariable("bpm_assignees");
for (ActivitiScriptNode personNode : assignees) {
String username = (String) personNode.getProperties().get("cm:userName");
logger.debug("username == " + username);
}
}
}
alfrescotomcat-stdout.2017-03-13.log:
...
2017-03-13 11:03:12,244 DEBUG [mswf.bpm.PropertiesReceiver] [http-apr-8080-exec-3] processInstanceId == 26205
2017-03-13 11:03:12,248 DEBUG [mswf.bpm.PropertiesReceiver] [http-apr-8080-exec-3] username == first
2017-03-13 11:03:12,250 DEBUG [mswf.bpm.PropertiesReceiver] [http-apr-8080-exec-3] username == second
...
但这是一个单独的项目,打包在一个 AMP 文件中。
好的,换一种方式。我可以在 ScriptExecutionListener
:
中获取流程实例的 ID
execution.getProcessInstanceId();
并调用 the Alfresco REST API from the Share side to retrieve all the information that I need (Thanks to Martin Ehe).
例如,此调用允许获取所有执行程序:
http://localhost:8080/alfresco/api/-default-/public/workflow/versions/1/processes/26205/variables
,其中流程实例的 26205 == id
。
但是我应该将此 ID 保存在何处才能从 Share 访问它?我可以在工作流模型中添加方面吗?它是否正确?..
请试试这个。
public JSONObject test(String userName) {
JSONObject allTasks = new JSONObject();
companyHome = repository.getCompanyHome();
try {
List<WorkflowTask> wft=serviceRegistry.getWorkflowService().getAssignedTasks(userName,WorkflowTaskState.IN_PROGRESS );
JSONArray ja = new JSONArray();
System.out.println("WF sizes = "+wft.size());
for (WorkflowTask temp : wft) {
JSONObject userWFDetails = new JSONObject();
userWFDetails.put("taskId", temp.getId());
userWFDetails.put("taskDesc", temp.getDescription());
userWFDetails.put("wfInstanceId", temp.getPath().getInstance().getId());
System.out.println("wf tasks-"+temp);
System.out.println("task id-"+temp.getId());
System.out.println("wf instance id-"+temp.getPath().getInstance().getId());
System.out.println("wf path id-"+temp.getPath().getId());
ja.put(userWFDetails);
}
allTasks.put("userTasksDetails", ja);
} catch (Exception e) {
e.printStackTrace();
}
return allTasks;
}
传递您的用户名。您将获得所有用户任务详细信息。 json 格式的工作流实例详细信息。
我的环境:
Alfresco Share v5.2.d (r134641-b15, Aikau 1.0.101.3, Spring Surf 5.2.d, Spring WebScripts 6.13, Freemarker 2.3.20-alfresco-patched, Rhino 1.7R4-alfresco-patched, Yui 2.9.0-alfresco-20141223)
Alfresco Community v5.2.0 (r134428-b13) schema 10005
当我启动工作流时,我可以分配执行者 - 将参与业务流程的用户列表。我需要获取所有这些用户的列表并在 reviewTask 屏幕中显示此列表。
为了显示这些数据,我有自定义的 FreeMarker 模板。我将从这个模板调用我的 Web 脚本。
为了通过 REST 与存储库交互,我使用 Web 脚本框架 MVC - 执行接收用户列表逻辑的控制器和 JSON 响应的 FreeMarker 模板。
有人向我提供
比方说,我启动了业务流程的多个实例。在工作流控制台中,我可以看到以下内容:
id: activiti01 , desc: DESCRIPTION_1 , start date: Sun Mar 12 19:19:09 GST 2017 , def: activiti$activitiParallelReview v1
id: activiti05 , desc: DESCRIPTION_2 , start date: Sun Mar 12 20:11:57 GST 2017 , def: activiti$activitiParallelReview v1
id: activiti38 , desc: DESCRIPTION_3 , start date: Sun Mar 12 20:12:55 GST 2017 , def: activiti$activitiParallelReview v1
因此我有三个ID:
activiti01
activiti05
activiti38
我只能在工作流控制台中使用这些 ID。
如何在控制器中获取这些标识符?
例如,我可以编写一个将由 Activiti 调用的 class 吗?比方说,
public class SomeListener implements TaskListener {
...
@Override
public void notify(DelegateTask task) {
...
String taskId = task.getId();
...
}
}
然后将其附加到某个任务的完成事件并将ID传递给控制器。
这是正确的方法吗?..
如果能提供信息,我将不胜感激。感谢大家。
我写了一个 class 实现了 ExecutionListener
接口。然后在从 mswf:submitParallelReviewTask
到 mswf:activitiReviewTask
.
我需要的所有属性,我都能在这里得到(感谢Gagravarr for his
public class PropertiesReceiver implements ExecutionListener {
private static final long serialVersionUID = 1L;
private static Log logger = LogFactory.getLog(PropertiesReceiver.class);
@Override
public void notify(DelegateExecution delegateExecution) throws Exception {
// TODO Auto-generated method stub
String processInstanceId = delegateExecution.getProcessInstanceId();
logger.debug("processInstanceId == " + processInstanceId);
ActivitiScriptNodeList assignees =
(ActivitiScriptNodeList) delegateExecution.getVariable("bpm_assignees");
for (ActivitiScriptNode personNode : assignees) {
String username = (String) personNode.getProperties().get("cm:userName");
logger.debug("username == " + username);
}
}
}
alfrescotomcat-stdout.2017-03-13.log:
...
2017-03-13 11:03:12,244 DEBUG [mswf.bpm.PropertiesReceiver] [http-apr-8080-exec-3] processInstanceId == 26205
2017-03-13 11:03:12,248 DEBUG [mswf.bpm.PropertiesReceiver] [http-apr-8080-exec-3] username == first
2017-03-13 11:03:12,250 DEBUG [mswf.bpm.PropertiesReceiver] [http-apr-8080-exec-3] username == second
...
但这是一个单独的项目,打包在一个 AMP 文件中。
好的,换一种方式。我可以在 ScriptExecutionListener
:
execution.getProcessInstanceId();
并调用 the Alfresco REST API from the Share side to retrieve all the information that I need (Thanks to Martin Ehe).
例如,此调用允许获取所有执行程序:
http://localhost:8080/alfresco/api/-default-/public/workflow/versions/1/processes/26205/variables
,其中流程实例的 26205 == id
。
但是我应该将此 ID 保存在何处才能从 Share 访问它?我可以在工作流模型中添加方面吗?它是否正确?..
请试试这个。
public JSONObject test(String userName) {
JSONObject allTasks = new JSONObject();
companyHome = repository.getCompanyHome();
try {
List<WorkflowTask> wft=serviceRegistry.getWorkflowService().getAssignedTasks(userName,WorkflowTaskState.IN_PROGRESS );
JSONArray ja = new JSONArray();
System.out.println("WF sizes = "+wft.size());
for (WorkflowTask temp : wft) {
JSONObject userWFDetails = new JSONObject();
userWFDetails.put("taskId", temp.getId());
userWFDetails.put("taskDesc", temp.getDescription());
userWFDetails.put("wfInstanceId", temp.getPath().getInstance().getId());
System.out.println("wf tasks-"+temp);
System.out.println("task id-"+temp.getId());
System.out.println("wf instance id-"+temp.getPath().getInstance().getId());
System.out.println("wf path id-"+temp.getPath().getId());
ja.put(userWFDetails);
}
allTasks.put("userTasksDetails", ja);
} catch (Exception e) {
e.printStackTrace();
}
return allTasks;
}
传递您的用户名。您将获得所有用户任务详细信息。 json 格式的工作流实例详细信息。