Моя среда:
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 с исправлениями, Rhino 1.7R4-alfresco с исправлениями, Yui 2.9.0-alfresco -20141223)
Alfresco Community v5.2.0 (r134428-b13) схема 10005
Когда я запускаю рабочий процесс, я могу назначить исполнителей — список пользователей, которые будут участвовать в бизнес-процессе. Мне нужно получить список всех этих пользователей и отобразить этот список на экране reviewTask.
Для отображения этих данных у меня есть собственный шаблон FreeMarker. Из этого шаблона я назову свой веб-скрипт.
Для взаимодействия с репозиторием через REST я использую Web Script Framework MVC — контроллер, выполняющий логику получения списка пользователей и шаблона FreeMarker для ответа JSON.
Мне предложили прекрасную идею, как это может быть сделано. Но я столкнулся с некоторой проблемой.
Допустим, я запустил несколько экземпляров бизнес-процесса. В консоли рабочего процесса я вижу следующее:
id: activiti$1801 , desc: DESCRIPTION_1 , start date: Sun Mar 12 19:19:09 GST 2017 , def: activiti$activitiParallelReview v1
id: activiti$2005 , desc: DESCRIPTION_2 , start date: Sun Mar 12 20:11:57 GST 2017 , def: activiti$activitiParallelReview v1
id: activiti$2138 , desc: DESCRIPTION_3 , start date: Sun Mar 12 20:12:55 GST 2017 , def: activiti$activitiParallelReview v1
Таким образом, у меня есть три идентификатора:
activiti$1801
activiti$2005
activiti$2138
Эти идентификаторы доступны мне только в Workflow Console.
Как я могу получить эти идентификаторы в контроллере?
Могу ли я, например, написать класс, который будет вызываться Activiti? Скажем,
public class SomeListener implements TaskListener {
...
@Override
public void notify(DelegateTask task) {
...
String taskId = task.getId();
...
}
}
Затем прикрепите его к событию завершения некоторой задачи и передайте идентификатор контроллеру.
Это правильный путь?..
Буду очень благодарен за информацию. Спасибо всем.
Я написал класс, который реализует ExecutionListener
интерфейс. Затем добавил его как прослушиватель при переходе от mswf:submitParallelReviewTask
к mswf:activitiReviewTask
.
Все свойства, которые мне нужны, я могу получить здесь (спасибо Gagravarr за его ответ):
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();
И вызовите Alfresco REST API со стороны общего доступа, чтобы получить всю необходимую мне информацию. (Спасибо Мартину Эхе).
Например, этот вызов позволяет получить всех исполнителей:
http://localhost:8080/alfresco/api/-default-/public/workflow/versions/1/processes/26205/variables
,где 26205 == id
экземпляра процесса.
Но где я должен сохранить этот идентификатор, чтобы получить к нему доступ из Share? Можно ли добавить аспект в модель рабочего процесса и правильно ли это?..