Конфигурация прослушивателя Activiti Escalation
Я использую activiti 5.18.
За кулисами: Есть несколько задач, которые маршрутизируются через рабочий процесс. Некоторые из этих задач имеют право на эскалацию. Я написал свой слушатель эскалации следующим образом.
@Component
public class EscalationTimerListener implements ExecutionListener {
@Autowired
ExceptionWorkflowService exceptionWorkflowService;
@Override
public void notify(DelegateExecution execution) throws Exception {
//Process the escalated tasks here
this.exceptionWorkflowService.escalateWorkflowTask(execution);
}
}
Теперь, когда я запускаю свой серверный фреймворк tomcat, внутренняя среда вызывает слушателя еще до того, как весь мой весенний контекст загружен. Следовательно, exceptionWorkflowService имеет значение null (поскольку Spring еще не вставил его!), И мой код обрывается.
Примечание: этот сценарий происходит только в том случае, если мой сервер не работает во время эскалации задач, и на этот раз я запускаю / перезапускаю свою публикацию сервера. Если мой сервер уже работает во время эскалации, то процесс проходит гладко. Потому что, когда сервер запущен, он внедрил службу, и мой слушатель сработал позже.
Я попытался отложить настройку Activiti с помощью @DependsOn
аннотации, чтобы он загружался после инициализации ExceptionWorkflowService, как показано ниже.
@Bean
@DependsOn({ "dataSource", "transactionManager","exceptionWorkflowService" })
public SpringProcessEngineConfiguration getConfiguration() {
final SpringProcessEngineConfiguration config = new SpringProcessEngineConfiguration();
config.setAsyncExecutorActivate(true);
config.setJobExecutorActivate(true);
config.setDataSource(this.dataSource);
config.setTransactionManager(this.transactionManager);
config.setDatabaseSchemaUpdate(this.schemaUpdate);
config.setHistory(this.history);
config.setTransactionsExternallyManaged(this.transactionsExternallyManaged);
config.setDatabaseType(this.dbType);
// Async Job Executor
final DefaultAsyncJobExecutor asyncExecutor = new DefaultAsyncJobExecutor();
asyncExecutor.setCorePoolSize(2);
asyncExecutor.setMaxPoolSize(50);
asyncExecutor.setQueueSize(100);
config.setAsyncExecutor(asyncExecutor);
return config;
}
Но это дает ошибку круговой ссылки.
Я также попытался добавить бин к SpringProcessEngineConfiguration
как ниже.
Map<Object, Object> beanObjectMap = new HashMap<>();
beanObjectMap.put("exceptionWorkflowService", new ExceptionWorkflowServiceImpl());
config.setBeans(beanObjectMap);
и доступ такой же в моем слушателе как:
Map<Object, Object> registeredBeans = Context.getProcessEngineConfiguration().getBeans();
ExceptionWorkflowService exceptionWorkflowService = (ExceptionWorkflowService) registeredBeans.get("exceptionWorkflowService");
exceptionWorkflowService.escalateWorkflowTask(execution);
Это работает, но мой репозиторий был автоматически подключен к моему сервису, который еще не был инициализирован! Так что опять выдает ошибку в сервисном слое:)
Так есть ли способ, которым я могу вызывать слушателей эскалации только после загрузки всего моего весеннего контекста?
2 ответа
Вы пытались связать класс с ApplicationListener? Не уверен, что это сработает, но в равной степени я не уверен, почему ваш код слушателя фактически выполняется при запуске.
Попробуйте установить тип реализации слушателей, используя класс Java или выражение делегата, а затем в классе реализуйте JavaDelegate вместо ExecutionListener.