Конфигурация прослушивателя 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.

Другие вопросы по тегам