Здравствуйте. У нас в фирме используется Alfresco's Activiti 6, и необходимо добавить timer boundary events на bpm-схему. Всяко-разно пробовал, и никак не получается сделать, чтобы он срабатывал. Пример моей bpm-схемы:
Если ставлю что-то после таймера, то процесс идёт по своему обычному маршруту. Если ничего не ставлю, идёт по ветке, исходящей из таймера. При этом без разницы, какой промежуток времени стоит у таймера: процесс идёт по той или по другой ветке сразу же.
Для создания объектов для работы с движком Активити использую Spring 5. Вот часть моего класса конфигурации:
@Bean
SpringProcessEngineConfiguration processEngineConfiguration(@Qualifier("dataSourceForActiviti") DataSource dataSourceForActiviti,
@Qualifier("transactionManagerForActiviti") PlatformTransactionManager transactionManagerForActiviti) {
SpringProcessEngineConfiguration processEngineConfiguration = new SpringProcessEngineConfiguration();
processEngineConfiguration.setTransactionManager(transactionManagerForActiviti);
processEngineConfiguration.setDataSource(dataSourceForActiviti)
.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE)
.setAsyncExecutorActivate(true)
;
processEngineConfiguration.setDeploymentResources(new Resource[]{
new ClassPathResource("bpm/LicensingProcess.bpmn20.xml"),
new ClassPathResource("bpm/ReissuanceLicenseProcess.bpmn20.xml"),
new ClassPathResource("bpm/IssueOfDuplicateProcess.bpmn20.xml"),
new ClassPathResource("bpm/IssuanceOfCopyProcess.bpmn20.xml"),
new ClassPathResource("bpm/TerminationOfLicenseProcess.bpmn20.xml"),
new ClassPathResource("bpm/ExtractFromRegisterOfLicensesProcess.bpmn20.xml")
});
return processEngineConfiguration;
}
@Bean
ProcessEngineFactoryBean processEngineFactoryBean(SpringProcessEngineConfiguration processEngineConfiguration) {
ProcessEngineFactoryBean processEngineFactoryBean = new ProcessEngineFactoryBean();
processEngineFactoryBean.setProcessEngineConfiguration(processEngineConfiguration);
return processEngineFactoryBean;
}
@Bean
RepositoryService repositoryService(ProcessEngineFactoryBean processEngineFactoryBean) throws Exception {
return processEngineFactoryBean.getObject().getRepositoryService();
}
@Bean
RuntimeService runtimeService(ProcessEngineFactoryBean processEngineFactoryBean) throws Exception {
return processEngineFactoryBean.getObject().getRuntimeService();
}
@Bean
TaskService taskService(ProcessEngineFactoryBean processEngineFactoryBean) throws Exception {
return processEngineFactoryBean.getObject().getTaskService();
}
В документации написано, что таймеры работают, только если
asyncExecutorActivate
установлен в
true
. И нашёл метод
setAsyncExecutorActivate
у
ProcessEngineConfiguration
. Но использование этого метода ничего не даёт.
Также находил такое решение в сети:
// Async Job Executor
final DefaultAsyncJobExecutor asyncExecutor = new DefaultAsyncJobExecutor();
asyncExecutor.setMaxPoolSize(50);
asyncExecutor.setQueueSize(100);
processEngineConfiguration.setAsyncExecutor(asyncExecutor);
Но оно тоже мне не помогает, хотя
asyncExecutor
после этого уже не
null
.
PSS В тоже время, подобная схема прекрасно работает в Activiti Modeler. И я пока не могу понять, поэтому это хорошо работает там и не работает у меня.
PSSS Написал простенькое приложение без спринга (на свинге). Использовал класс
StandaloneProcessEngineConfiguration
, не использовал
ProcessEngineBeanFactoryBean
. И тоже всё работало. Но только пока после boundary timer-а не стоит script task или service task. С ними - не работает (по первому не находит движок груви, по второму - не видит указанный класс (причём указываю полное имя класса, и он там точно есть)). Если после boundary timer стоит user task или manual task, то всё нормально отрабатывает. Почему не работает с script task и service task я таки и не понял. Осталось попробовать с классами
SpringProcessEngineConfiguration
и
ProcessEngineBeanFactoryBean
, и с контейнером бинов спринга.