Activiti

Материал из Course Orchestra
Перейти к: навигация, поиск
Showcase

Создание решений на КУРС:Showcase

Поддержка событий в Activiti

Начиная с версии 3.5.1.3630 в Showcase добавлена поддержка обработки событий (запуск скриптов celesta при наступлении события), генерируемых движком Activiti. Поддержка jython скриптов будет реализована в ближайшее время.

Алгоритм использования данного функционала следующий:

  • При запуске движка Activiti, либо перед запуском процесса разработчик решения должен указать набор событий, а также соответствующие имена скриптов celesta для запуска. Имена задаются в соответствии с принципом универсальных источников. В случае с celesta они должны заканчиваться на ".cl" или ".celesta". Для задания этого набора необходимо использовать переменную типа словарь - Map<ActivitiEventType, List<String>>. Для доступа к этой переменной в вашем celesta скрипте вам необходимо импортировать серверный java класс-синглтон AppInfoSingleton из пакета ru.curs.showcase.runtime. Доступ к переменной словарю осуществляется следующей строкой кода:
AppInfoSingleton.getAppInfo().getActivitiEventScriptDictionary() 

В данном словаре организовано хранение значений по ключу типа ActivitiEventType, который также необходимо импортировать в ваш скрипт (импортировать отсюда: org.activiti.engine.delegate.event.ActivitiEventType). ActivitiEventType - это тип перечисление (enum) всех возможных событий, которые генерирует движок Activiti. Полный список событий доступен тут: http://www.activiti.org/userguide/#eventDispatcher (см. таблицу 3.2). Значениями данного словаря являются списки celesta скриптов, которые необходимо запустить по наступлению события Activiti, тип которого соответствует ключу словаря. Список имеет тип List<String>. Этот класс принадлежит библиотеке java.util. Чтобы создать объект списка, можно воспользоваться кодом:

List<String> list = new ArrayList<String>();

где класс ArrayList также принадлежит библиотеке java.util. Далее, разработчик решения заполняет этот список названиями celesta скриптов. Это можно сделать с помощью метода:

list.add(строка_с_именем_сelesta_скрипта);

Удалять строки из списка можно так:

list.remove(строка_с_именем_сelesta_скрипта);

Очистить список можно так:

list.clear();

Проверить, содержит ли список строку, так:

list.contains(строка_с_именем_сelesta_скрипта);

Этот метод возвращает тип boolean. Здесь значение строка_с_именем_сelesta_скрипта определяет имя сelesta-процедуры (в виде, например grain.module.function.cl). Заполненный список кладётся в словарь с соответствующим ключом.

Итак, задать список событий, которые будут обрабатываться, и определить соответствующие им списки скриптов можно, например так:

AppInfoSingleton.getAppInfo().getActivitiEventScriptDictionary().put(ActivitiEventType.тип_события, list),

а удалить так:

AppInfoSingleton.getAppInfo().getActivitiEventScriptDictionary().remove(ActivitiEventType.тип_события), 

где ActivitiEventType.тип_события задается, например так ActivitiEventType.TASK_ASSIGNED.

  • При наступлении события обработчик сравнивает тип наступившего события со списком событий заданных разработчиком решения (см. пункт 1). Если событие такого типа было задано, то исполняются соответствующие скрипты celesta из списка скриптов, соответствующего этому событию. В противном случае ничего не происходит.
  • В скрипт celesta, который запускается при наступлении события будет приходить переменная event типа org.activiti.engine.delegate.event.ActivitiEvent.

С помощью данной переменной можно получить доступ к значениям идентифицирующим процесс и этап процесса.

Список доступных методов этого класса (см. подробнее http://www.activiti.org/javadocs/index.html?help-doc.html):

EngineServices getEngineServices() 
String getExecutionId() 
String getProcessDefinitionId() 
String getProcessInstanceId() 
ActivitiEventType getType() 
  • ВНИМАНИЕ! Скрипты celesta всегда запускаются от пользователя super, который присутствует в celesta по умолчанию.

Пример celesta-скрипта для заполнения переменной-словаря типа Map<ActivitiEventType, List<String>>:

    #coding:utf-8

    from org.activiti.engine.delegate.event import ActivitiEventType    
    from java.util import ArrayList
    from ru.curs.showcase.runtime import AppInfoSingleton


    settingsManager = SettingsManager()
    
    eventsList = settingsManager.getGrainSettings('activitiEvents/event/@name','workflow')
    handlersList = settingsManager.getGrainSettings('activitiEvents/event/@script','workflow')
    
    eventsDict = dict()
    for i in range(len(eventsList)):
        if eventsList[i] not in eventsDict:
            eventsDict[eventsList[i]] = ArrayList()
        eventsDict[eventsList[i]].add(handlersList[i])
        

    if 'TASK_CREATED' not in eventsDict:
        eventsDict['TASK_CREATED'] = ArrayList()
    eventsDict['TASK_CREATED'].add('workflow.eventHandler.taskCreatedHandler.cl')
    
    for eventType in eventsDict:
        AppInfoSingleton.getAppInfo().\
        getActivitiEventScriptDictionary().\
        put(getattr(ActivitiEventType,eventType), eventsDict[eventType])

Пример celesta-скрипта для проверки работы введённого функционала:

#coding: utf-8

def taskComplete(context,event):
    raise Exception(type(context),type(event))

Здесь в качестве второго параметра функции taskComplete передаётся объект event, представляющий собой именно то событие, которое генерируется Activiti и которое передаётся из обработчика события в данный celesta-скрипт.

Базовая настройка Activiti

Базовыми настройками Activiti являются:

Параметр Назначение Обязательный Пример значения Значение по умолчанию
activiti.enable Задаёт, запускать ли движок Activiti при старте сервера приложений Да true или false false
activiti.database.databaseType Тип базы данных для Activiti Да mssql -
activiti.database.jdbcUrl URL соединения с базой данных Activiti Да jdbc:sqlserver://172.16.1.147:1433;databasename=activiti -
activiti.database.jdbcDriver JDBC Driver соединения с базой данных Activiti Да com.microsoft.sqlserver.jdbc.SQLServerDriver -
activiti.database.jdbcUsername Имя пользователя базы данных Activiti Да -
activiti.database.jdbcPassword Пароль пользователя базы данных Activiti Да -
activiti.history.level Уровень сохранения истории деятельности процессов Activiti Да full, audit, activity или none audit
activiti.database.table.prefix Имя табличного префикса в Activiti (идёт "в связке" со следующим свойством) Да schema_name. -
activiti.table.prefix.is.schema Задаёт, является ли табличный префикс схемой или нет (идёт "в связке" с предыдущим свойством) Да true или false false
activiti.jobexecutor.activate Задаёт, активировать ли свойство jobExecutorActivate или нет Нет true или false false