如何获取控制器中流程实例的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:submitParallelReviewTaskmswf: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 格式的工作流实例详细信息。