BPM, запуск ДатаМенеджера из скриптового таска, есть ли "подводные камни"?

Добрый день!
Jmix 2.4, аддон 2.4.
Подскажите пожалуйста, есть ли какие-то ограничения или нюансы (при нагрузке), которые необходимо учесть при создании через ДатаМенеджер экземпляров JMIX-сущностей из groovy-скриптов. Примерно в таком ключе (создаем связанный с экземпляром процесса объект внешней сущности и линкуем его через переменную-ссылку):

//Создание экземпляра связанного Заключения

def var_datamanager = core_DataManager as io.jmix.core.DataManager

def var_conclusion = var_datamanager.create(ru.skblab.nexus.bpm.entity.Conclusion)

var_conclusion.beginTs = java.time.LocalDateTime.now()

var_conclusion.inn = "" + zapros_inn

var_conclusion = var_datamanager.save(var_conclusion)

execution.setVariable( "bpm_Conclusion" , var_conclusion)

Технически все отлично работает, но пока не понимаем годится ли такой вариант для прода.

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

    var_conclusion = var_datamanager.save(var_conclusion_content1, var_conclusion_content2, var_conclusion_content3, var_conclusion).get(ru.skblab.nexus.bpm.entity.Conclusion, var_conclusion.getId())

Подскажите пожалуйста, как из groovy скрипта для BPM-аддона JMIX наиболее корректно будет получить processDefinitionId, то есть ссылку на описание и ссылку на запущенный экземпляр бизнес-процесса?

И можно ли из скрипта позвать историю задач по экземпляру процесса?
historyService.createHistoricActivityInstanceQuery()
.activityType(“serviceTask”)
.processDefinitionId(“XXX”)
.finished()
.orderByHistoricActivityInstanceEndTime().desc()
.listPage(0, 1);

Могу перефразировать вопрос:

  • Есть ли какие-то ограничения для использования interface Execution из рантайма ядра?
  • Есть ли какие-то ограничения для использования скриптами из-под BPM-аддона Process Engine API ?

Здравствуйте Игорь,

Ограничения или нюансы при нагрузке

Со стороны платформы, мы не проводили тестирование при нагрузке, поэтому на этот вопрос нету четкого ответа. Здесь стоит обратится к документации непосредственно самого Flowable или на их форум.

Process ID в Script Tas

Вы можете использовать в Script Task переменную execution, которая является объектом org/flowable/engine/impl/persistence/entity/ExecutionEntityImpl.java

def processInstanceId = execution.getProcessInstanceId()
println "Process Instance ID: ${processInstanceId}"

Немного подробнее про этот объект:

Вызов истории

Да, вы можете напрямую обращаться к HistoryService. В Script Task вы можете обращаться к любым спринг бинам. Например следующий код будет работать:

def historyService = historyServiceBean
def historicProcessInstances = historyService.createHistoricProcessInstanceQuery()
    .processInstanceId(execution.getProcessInstanceId())
    .list()

Похожий вопрос: Service bean call inside a script task - #3 by d.cherkasov - Support - Jmix

Ограничения

Я немного по исследовал ваш вопрос, хоть и документация Flowable не все аспекты скриптинга освещает, но явных ограничений не нашёл, Наоборот, скрипты предоставляют большую свободу действий, что является опасным моментом при некорректном использовании.

С Уважением,
Никита

1 симпатия

Благодарю!
Мы тоже поэкспериментировали, все красиво получилось, вопрос можно закрывать.

1 симпатия