Инциденты

Этот раздел перенесён из документации Camunda 7 и в дальнейшем будет доработан с учётом особенностей OpenBPM Engine

Инциденты — это значимые события, происходящие в процессном движке. Такие инциденты, как правило, указывают на определённые проблемы, связанные с выполнением процессов. Примерами таких инцидентов могут быть неудачно выполненные задания (jobs) с исчерпанными попытками повторного выполнения (retries = 0), что указывает на то, что выполнение «застряло» и требуется ручное административное вмешательство для восстановления экземпляра процесса. При возникновении подобных инцидентов процессный движок генерирует внутреннее событие, которое может быть обработано настраиваемым обработчиком инцидентов (incident handler).

В конфигурации по умолчанию процессный движок записывает инциденты в базу данных процессного движка. После этого можно выполнять запросы к базе данных по различным типам и видам инцидентов, используя IncidentQuery, предоставляемый сервисом RuntimeService:

runtimeService.createIncidentQuery()
  .processDefinitionId("someDefinition")
  .list();

Инциденты хранятся в таблице базы данных ACT_RU_INCIDENT.

Если необходимо настроить поведение обработки инцидентов, можно заменить стандартные обработчики инцидентов в конфигурации процессного движка и предоставить собственные реализации (см. ниже).

Типы инцидентов (Incident Types)

Существует несколько типов инцидентов. В настоящее время процессный движок поддерживает следующие типы:

  • failedJob: возникает, когда автоматические попытки повторного выполнения задания (таймер или асинхронное продолжение) исчерпаны. Инцидент указывает на то, что соответствующее выполнение «застряло» и не будет продолжено автоматически. Требуется административное вмешательство. Инцидент считается разрешённым, когда задание выполнено вручную или количество попыток (retries) для соответствующего задания установлено в значение > 0.

  • failedExternalTask: возникает, когда воркер внешней задачи (External Task) сообщает об ошибке, и заданное количество повторных попыток установлено в значение ⇐ 0. Инцидент указывает на то, что соответствующая внешняя задача «застряла» и больше не будет получена воркером. Требуется административное вмешательство для сброса значения retries.

С помощью Java API можно создавать пользовательские (custom) инциденты любого типа.

Создание и разрешение пользовательских инцидентов (Creating and Resolving Custom Incidents)

Инцидент любого типа может быть создан вызовом RuntimeService#createIncident:

runtimeService.createIncident("someType", "someExecution", "someConfiguration", "someMessage");
  1. или напрямую через DelegateExecution#createIncident:

delegateExecution.createIncident("someType", "someConfiguration", "someMessage");

Пользовательские инциденты всегда должны быть связаны с существующим Execution.

Инцидент любого типа, за исключением failedJob и failedExternalTask, может быть разрешён (resolved) с помощью вызова RuntimeService#resolveIncident.

Инциденты также могут быть созданы и разрешены через REST API.

(Де)активация инцидентов ((De-)Activate Incidents)

Процессный движок позволяет настраивать, должны ли возникать инциденты определённых типов или нет, в зависимости от типа инцидента. В классе io.openbpm.bpm.engine.ProcessEngineConfiguration доступны следующие свойства:

  • createIncidentOnFailedJobEnabled: указывает, должны ли создаваться инциденты типа Failed Job или нет.

Реализация пользовательских обработчиков инцидентов (Implement Custom Incident Handlers)

Обработчики инцидентов (Incident Handlers) отвечают за обработку инцидентов определённого типа (см. раздел «Типы инцидентов»).

Обработчик инцидентов реализует следующий интерфейс:

public interface IncidentHandler {

  String getIncidentHandlerType();

  Incident handleIncident(IncidentContext context, String message);

  void resolveIncident(IncidentContext context);

  void deleteIncident(IncidentContext context);

}

Метод handleIncident вызывается при создании нового инцидента. Метод resolveIncident вызывается при разрешении инцидента.

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

io.openbpm.bpm.engine.impl.cfg.ProcessEngineConfigurationImpl.setCustomIncidentHandlers(List<IncidentHandler>)

Примером пользовательского обработчика инцидентов может быть обработчик, который расширяет стандартное поведение, отправляя email администратору каждый раз, когда возникает инцидент типа failedJob. Однако простое добавление пользовательского обработчика полностью переопределяет стандартное поведение. В результате стандартный обработчик инцидентов больше не будет выполняться. Если требуется сохранить стандартное поведение, пользовательский обработчик также должен вызывать стандартный обработчик, что предполагает использование внутреннего API.

Обратите внимание, что этот API не является частью публичного API и может изменяться в будущих версиях.

Составные обработчики инцидентов (Composite Incident Handlers)

По умолчанию инцидент может быть обработан только одним обработчиком с соответствующим типом. Составные обработчики инцидентов (composite incident handlers) позволяют определить один основной (main) и несколько вспомогательных (sub) обработчиков. При этом возвращается только результат основного обработчика.

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

<property name="compositeIncidentHandlersEnabled" value="true" />

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

io.openbpm.bpm.engine.impl.cfg.ProcessEngineConfigurationImpl.setCustomIncidentHandlers(List<IncidentHandler>)

Все дополнительные обработчики будут добавлены как подчинённые (sub handlers) к CompositeIncidentHandler для соответствующего типа обработчика.

По умолчанию основным обработчиком является DefaultIncidentHandler. Чтобы переопределить основной обработчик, необходимо создать CompositeIncidentHandler с собственным основным IncidentHandler и инициализировать обработчики инцидентов в конфигурации движка до его создания.

См. javadoc для более подробной информации: Composite Incident Handler.

Лицензия и атрибуция

Эта документация была создана на базе материала "Camunda 7 Docs" от Camunda, находится под лицензией Creative Commons Attribution-ShareAlike 3.0 Unported License .

Оригинал документации: https://docs.camunda.org