Regras de Processo Válido
Esta página lista o que o DeployValidator do motor verifica ao implantar uma definição de processo. Uma
definição que viola qualquer regra abaixo é rejeitada com InvalidProcessDefinitionException — antes de qualquer
instância poder ser iniciada. Cada regra tem um identificador estável no formato KIKWI-NNN, para você achar a
causa rapidamente a partir da mensagem de erro.
O escopo é a validade estrutural da definição (schema e referências entre nós). Para o comportamento de cada tipo de nó em execução, veja Modelo de Processo e Nós de Fluxo.
Regras verificadas no deploy
Regras estruturais gerais do grafo
| ID | Regra | Descrição |
|---|---|---|
| KIKWI-001 | Integridade referencial das sequence flows | Todo targetNodeId declarado em uma sequence flow de qualquer nó deve referenciar o identificador de um nó existente em flowNodes. |
| KIKWI-003 | Ponto de entrada declarado e existente | O campo defaultStartPoint da definição de processo deve estar preenchido e referenciar o identificador de um nó existente em flowNodes. |
DEFAULT_START_EVENT
| ID | Regra | Descrição |
|---|---|---|
| KIKWI-009 | Saída obrigatória do evento de início | Todo nó DEFAULT_START_EVENT deve declarar exatamente uma sequence flow em outgoing. |
EXECUTABLE_TASK
| ID | Regra | Descrição |
|---|---|---|
| KIKWI-011 | Executor obrigatório | Todo nó EXECUTABLE_TASK deve declarar o campo executor com um valor não nulo e não vazio. |
| KIKWI-012 | Executor resolvível | O valor declarado em executor deve corresponder a um componente registrado do tipo executor de tarefa, disponível no ambiente de execução do processo. |
EXCLUSIVE_GATEWAY
| ID | Regra | Descrição |
|---|---|---|
| KIKWI-014 | Tipo de provedor de resposta obrigatório | Todo EXCLUSIVE_GATEWAY deve declarar providerType com um dos valores reconhecidos: BEAN ou VARIABLE. |
| KIKWI-015 | Bean do provedor de resposta preenchido | Se providerType for BEAN, o campo providerBean deve estar preenchido. |
| KIKWI-016 | Bean do provedor de resposta resolvível | Se providerType for BEAN, o valor de providerBean deve corresponder a um componente registrado do tipo provedor de resposta, disponível no ambiente de execução. |
| KIKWI-017 | Variável do provedor de resposta preenchida | Se providerType for VARIABLE, o campo providerVariable deve estar preenchido. |
| KIKWI-018 | Unicidade da sequence flow padrão | Um EXCLUSIVE_GATEWAY deve declarar no máximo uma sequence flow de saída com isDefault: true. |
| KIKWI-019 | Unicidade da sequence flow de valor nulo | Um EXCLUSIVE_GATEWAY deve declarar no máximo uma sequence flow de saída com handlesNull: true. |
| KIKWI-020 | Unicidade de resposta esperada | As sequence flows de saída de um mesmo EXCLUSIVE_GATEWAY não devem repetir o mesmo valor de expectedAnswer entre si. |
| KIKWI-021 | Saída obrigatória do gateway de decisão | Todo EXCLUSIVE_GATEWAY deve declarar ao menos uma sequence flow em outgoing. |
PARALLEL_GATEWAY e JOIN_GATEWAY
| ID | Regra | Descrição |
|---|---|---|
| KIKWI-024 | Join de destino obrigatório | Todo PARALLEL_GATEWAY deve declarar o campo targetJoinId. |
| KIKWI-025 | Join de destino existente | O valor de targetJoinId deve referenciar o identificador de um nó existente em flowNodes. |
| KIKWI-026 | Tipo do join de destino | O nó referenciado por targetJoinId deve ser do tipo JOIN_GATEWAY. |
Timers de borda (BOUNDARY_INTERRUPTIVE_TIMER, BOUNDARY_NON_INTERRUPTIVE_TIMER)
| ID | Regra | Descrição |
|---|---|---|
| KIKWI-031 | Referência de evento de borda existente | Todo identificador declarado em boundaryEventIds de um nó deve corresponder a um nó existente em flowNodes. |
| KIKWI-032 | Tipo de evento de borda reconhecido | Todo identificador declarado em boundaryEventIds deve corresponder a um nó de evento de borda aceito por aquele tipo de nó pai — ver as restrições por tipo nas regras KIKWI-041, 048, 049, 057 e 059. |
| KIKWI-033 | Tipo de provedor do timer interruptivo | Todo BOUNDARY_INTERRUPTIVE_TIMER deve declarar providerType com um dos valores reconhecidos: STATIC, VARIABLE ou BEAN. |
| KIKWI-034 | Valor estático do timer preenchido | Se providerType for STATIC, o campo staticValue deve estar preenchido. |
| KIKWI-035 | Variável do timer preenchida | Se providerType for VARIABLE, o campo providerVariable deve estar preenchido. |
| KIKWI-036 | Bean do timer preenchido | Se providerType for BEAN, o campo providerBean deve estar preenchido. |
| KIKWI-037 | Política de agendamento obrigatória | Todo BOUNDARY_NON_INTERRUPTIVE_TIMER deve declarar o campo schedulePolicy. |
| KIKWI-038 | Tipo de política de agendamento reconhecido | schedulePolicy.type deve ser RATE_DURATION ou FIXED_DATES. |
| KIKWI-039 | Expressão de taxa preenchida | Se schedulePolicy.type for RATE_DURATION, o campo expression deve estar preenchido. |
| KIKWI-040 | Datas fixas preenchidas | Se schedulePolicy.type for FIXED_DATES, o campo fixedDates deve conter ao menos uma data. |
| KIKWI-048 | Nó pai restrito a EXTERNAL_TASK para timer interruptivo | Um BOUNDARY_INTERRUPTIVE_TIMER só deve estar referenciado em boundaryEventIds de um nó do tipo EXTERNAL_TASK — nunca EXECUTABLE_TASK. Não se aplica a BOUNDARY_NON_INTERRUPTIVE_TIMER, que não cancela o nó pai. |
BOUNDARY_ERROR_HANDLER
| ID | Regra | Descrição |
|---|---|---|
| KIKWI-041 | Tipo de nó pai restrito a EXECUTABLE_TASK | Um BOUNDARY_ERROR_HANDLER só deve estar referenciado em boundaryEventIds de um nó do tipo EXECUTABLE_TASK. |
| KIKWI-042 | Unicidade de código de erro por nó pai | Handlers de erro anexados ao mesmo nó pai não devem repetir o mesmo valor de errorCode, e no máximo um handler sem errorCode (curinga) é permitido por nó pai. |
RetryPolicy (aplicável a EXECUTABLE_TASK)
| ID | Regra | Descrição |
|---|---|---|
| KIKWI-043 | Tentativas máximas explícitas | Se retryPolicy estiver presente, o campo maxRetries deve estar explicitamente presente e ser maior ou igual a 1. |
| KIKWI-044 | Estratégia de retry reconhecida | Se retryPolicy estiver presente, o campo strategy deve ser LINEAR ou EXPONENTIAL_BACKOFF. |
| KIKWI-045 | Intervalo inicial do backoff exponencial | Se retryPolicy.strategy for EXPONENTIAL_BACKOFF, o campo initialInterval deve estar preenchido. |
CALL_ACTIVITY_COORDINATOR
| ID | Regra | Descrição |
|---|---|---|
| KIKWI-047 | calledElement obrigatório | calledElement não pode ser nulo/vazio. |
| KIKWI-052 | elementVariable requer collectionVariable | elementVariable só é válido quando collectionVariable também está presente. |
BOUNDARY_INTERRUPTIVE_CATCH_EVENT
| ID | Regra | Descrição |
|---|---|---|
| KIKWI-049 | Nó pai restrito a EXTERNAL_TASK ou TIMER_TASK | Um BOUNDARY_INTERRUPTIVE_CATCH_EVENT só deve estar referenciado em boundaryEventIds de um nó do tipo EXTERNAL_TASK ou TIMER_TASK — nunca EXECUTABLE_TASK. Um EXECUTABLE_TASK executa seu handler de forma síncrona, sem fronteira transacional onde o motor possa interromper com segurança antes de um efeito colateral real já ter acontecido. |
| KIKWI-050 | Tipo de provedor obrigatório | Todo BOUNDARY_INTERRUPTIVE_CATCH_EVENT deve declarar providerType com um dos valores reconhecidos: STATIC, VARIABLE, BEAN ou TEMPLATE. |
EVENT_CATCHER
| ID | Regra | Descrição |
|---|---|---|
| KIKWI-054 | Tipo de provedor obrigatório | Todo EVENT_CATCHER deve declarar providerType com um dos valores reconhecidos: STATIC, VARIABLE, BEAN ou TEMPLATE. |
| KIKWI-055 | Campo do provedor preenchido | Conforme providerType: staticKey (STATIC), providerVariable (VARIABLE), providerBean resolvível a um CorrelationKeysProvider (BEAN), ou correlationTemplates não-vazio (TEMPLATE). |
| KIKWI-056 | GROUP incompatível com STATIC | catchType: GROUP não pode combinar com providerType: STATIC — STATIC sempre resolve exatamente 1 chave, incompatível com o scatter-gather de GROUP. |
| KIKWI-057 | boundaryEventIds restrito a timers | Um EVENT_CATCHER.boundaryEventIds só pode referenciar BOUNDARY_INTERRUPTIVE_TIMER ou BOUNDARY_NON_INTERRUPTIVE_TIMER — nem BOUNDARY_ERROR_HANDLER, nem BOUNDARY_INTERRUPTIVE_CATCH_EVENT (ainda não suportado como boundary de outro EVENT_CATCHER). |
EVENT_THROWER
| ID | Regra | Descrição |
|---|---|---|
| KIKWI-058 | Tipo de provedor obrigatório + campo correspondente | Mesma validação condicional de KIKWI-054/055, aplicada a EVENT_THROWER — sem catchType/matchPolicy (não existem nesse tipo de nó; sempre resolve exatamente 1 chave, política v1 é falhar se ninguém estiver esperando). |
TIMER_TASK
| ID | Regra | Descrição |
|---|---|---|
| KIKWI-059 | boundaryEventIds restrito a timers e catch event | Um TIMER_TASK.boundaryEventIds só pode referenciar BOUNDARY_INTERRUPTIVE_TIMER, BOUNDARY_NON_INTERRUPTIVE_TIMER ou BOUNDARY_INTERRUPTIVE_CATCH_EVENT — nunca BOUNDARY_ERROR_HANDLER (não há handler síncrono nenhum pra um TIMER_TASK resolver via try/catch). |
Catálogo de variáveis e variableBindings
Ver Catálogo de Variáveis e Contrato de Dados.
| ID | Regra | Descrição |
|---|---|---|
| KIKWI-060 | Declaração bem-formada | Toda entrada de variableDeclarations tem key não-vazia e única no processo, label não-vazio e format preenchido. |
| KIKWI-061 | Opções só (e sempre) em selects | SINGLE_SELECT/MULTI_SELECT exigem options não-vazio, com value não-vazio e único; qualquer outro formato rejeita options. |
| KIKWI-062 | MONEY com moeda | format: MONEY exige currency ISO-4217 válida (java.util.Currency). |
| KIKWI-063 | Regex seguro e aplicável | validationRegex só em SHORT_TEXT/LONG_TEXT, com no máximo 512 caracteres, e precisa compilar. |
| KIKWI-064 | Vínculo referencia o catálogo | Todo variableBindings.inputs[]/outputs[] referencia uma key declarada em variableDeclarations, no máximo uma vez por lista. |
| KIKWI-065 | Sem inputs em EXECUTABLE_TASK | EXECUTABLE_TASK não tem ator fornecendo dados — só outputs é aceito. |
O que o deploy não verifica
- Os campos de tempo de um
TIMER_TASK(providerType/staticValue/providerVariable/providerBean) não são validados no deploy — um valor mal configurado só falha quando o timer é efetivamente instanciado. Ver Timer Task. - Que
collectionVariablede umCALL_ACTIVITY_COORDINATORresolva para umaListem runtime — o motor não tem declaração de tipo de variável de processo. Ver CALL_ACTIVITY_COORDINATOR — Subprocessos.
Boas práticas de modelagem
As recomendações abaixo não são verificadas no deploy — uma definição que as ignora é implantada normalmente, mas tende a se comportar de um jeito que você não pretendia. O linter do Craft sinaliza parte delas durante a modelagem.
- O ponto de entrada é um
DEFAULT_START_EVENT(KIKWI-004), e toda definição tem ao menos um (KIKWI-008). - A chave de cada nó em
flowNodesé igual ao seuid(KIKWI-002). O motor usa só a chave do mapa, então divergir não quebra a execução — mas confunde quem lê. - Todo nó é alcançável a partir de
defaultStartPoint(KIKWI-005), e todo timer de borda está referenciado emboundaryEventIdsde algum nó (KIKWI-030) — um nó órfão nunca executa. - Só
DEFAULT_END_EVENT,JOIN_GATEWAYeBOUNDARY_ERROR_HANDLERficam sem saída (KIKWI-006), e umDEFAULT_END_EVENTnão declara saída (KIKWI-010). - Fora de gateways de decisão e divisão, no máximo uma saída por nó (KIKWI-007).
EXTERNAL_TASKnão declaraexecutor(KIKWI-013) — o campo é ignorado nesse tipo de nó.- Todo
EXCLUSIVE_GATEWAYtem uma arestaisDefault: true(KIKWI-022) e, se a resposta puder sernull, uma arestahandlesNull: true(KIKWI-023) — sem elas, uma resposta não prevista viraIllegalStateExceptionem execução. - Um
PARALLEL_GATEWAYabre ao menos dois ramos (KIKWI-027), e todo ramo converge para oJOIN_GATEWAYdeclarado emtargetJoinId(KIKWI-029) — um ramo que termina antes faz o join esperar para sempre. schedulePolicy.maxOccurrences, quando declarado, é>= 1(KIKWI-053) —0ou negativo nunca agenda um ciclo.- Uma
retryPolicyLINEARdeclaraintervalscom ao menos um elemento (KIKWI-046). - Um
BOUNDARY_INTERRUPTIVE_CATCH_EVENTnão declaracatchTypenemmatchPolicy(KIKWI-051) — um evento de borda sempre resolve exatamente uma chave.
Ver também
- Modelo de Processo e Nós de Fluxo — estrutura de dados de cada tipo de nó.
- Navegação e Gateways de Decisão, Timers e Agendamento, Retry e Resiliência, Tratamento de Erros de Negócio — semântica funcional de cada categoria de nó coberta por esta página.