Pular para o conteúdo principal

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​

IDRegraDescrição
KIKWI-001Integridade referencial das sequence flowsTodo targetNodeId declarado em uma sequence flow de qualquer nó deve referenciar o identificador de um nó existente em flowNodes.
KIKWI-003Ponto de entrada declarado e existenteO campo defaultStartPoint da definição de processo deve estar preenchido e referenciar o identificador de um nó existente em flowNodes.

DEFAULT_START_EVENT​

IDRegraDescrição
KIKWI-009Saída obrigatória do evento de inícioTodo nó DEFAULT_START_EVENT deve declarar exatamente uma sequence flow em outgoing.

EXECUTABLE_TASK​

IDRegraDescrição
KIKWI-011Executor obrigatórioTodo nó EXECUTABLE_TASK deve declarar o campo executor com um valor não nulo e não vazio.
KIKWI-012Executor resolvívelO 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​

IDRegraDescrição
KIKWI-014Tipo de provedor de resposta obrigatórioTodo EXCLUSIVE_GATEWAY deve declarar providerType com um dos valores reconhecidos: BEAN ou VARIABLE.
KIKWI-015Bean do provedor de resposta preenchidoSe providerType for BEAN, o campo providerBean deve estar preenchido.
KIKWI-016Bean do provedor de resposta resolvívelSe 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-017Variável do provedor de resposta preenchidaSe providerType for VARIABLE, o campo providerVariable deve estar preenchido.
KIKWI-018Unicidade da sequence flow padrãoUm EXCLUSIVE_GATEWAY deve declarar no máximo uma sequence flow de saída com isDefault: true.
KIKWI-019Unicidade da sequence flow de valor nuloUm EXCLUSIVE_GATEWAY deve declarar no máximo uma sequence flow de saída com handlesNull: true.
KIKWI-020Unicidade de resposta esperadaAs sequence flows de saída de um mesmo EXCLUSIVE_GATEWAY não devem repetir o mesmo valor de expectedAnswer entre si.
KIKWI-021Saída obrigatória do gateway de decisãoTodo EXCLUSIVE_GATEWAY deve declarar ao menos uma sequence flow em outgoing.

PARALLEL_GATEWAY e JOIN_GATEWAY​

IDRegraDescrição
KIKWI-024Join de destino obrigatórioTodo PARALLEL_GATEWAY deve declarar o campo targetJoinId.
KIKWI-025Join de destino existenteO valor de targetJoinId deve referenciar o identificador de um nó existente em flowNodes.
KIKWI-026Tipo do join de destinoO nó referenciado por targetJoinId deve ser do tipo JOIN_GATEWAY.

Timers de borda (BOUNDARY_INTERRUPTIVE_TIMER, BOUNDARY_NON_INTERRUPTIVE_TIMER)​

IDRegraDescrição
KIKWI-031Referência de evento de borda existenteTodo identificador declarado em boundaryEventIds de um nó deve corresponder a um nó existente em flowNodes.
KIKWI-032Tipo de evento de borda reconhecidoTodo 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-033Tipo de provedor do timer interruptivoTodo BOUNDARY_INTERRUPTIVE_TIMER deve declarar providerType com um dos valores reconhecidos: STATIC, VARIABLE ou BEAN.
KIKWI-034Valor estático do timer preenchidoSe providerType for STATIC, o campo staticValue deve estar preenchido.
KIKWI-035Variável do timer preenchidaSe providerType for VARIABLE, o campo providerVariable deve estar preenchido.
KIKWI-036Bean do timer preenchidoSe providerType for BEAN, o campo providerBean deve estar preenchido.
KIKWI-037Política de agendamento obrigatóriaTodo BOUNDARY_NON_INTERRUPTIVE_TIMER deve declarar o campo schedulePolicy.
KIKWI-038Tipo de política de agendamento reconhecidoschedulePolicy.type deve ser RATE_DURATION ou FIXED_DATES.
KIKWI-039Expressão de taxa preenchidaSe schedulePolicy.type for RATE_DURATION, o campo expression deve estar preenchido.
KIKWI-040Datas fixas preenchidasSe schedulePolicy.type for FIXED_DATES, o campo fixedDates deve conter ao menos uma data.
KIKWI-048Nó pai restrito a EXTERNAL_TASK para timer interruptivoUm 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​

IDRegraDescrição
KIKWI-041Tipo de nó pai restrito a EXECUTABLE_TASKUm BOUNDARY_ERROR_HANDLER só deve estar referenciado em boundaryEventIds de um nó do tipo EXECUTABLE_TASK.
KIKWI-042Unicidade de código de erro por nó paiHandlers 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)​

IDRegraDescrição
KIKWI-043Tentativas máximas explícitasSe retryPolicy estiver presente, o campo maxRetries deve estar explicitamente presente e ser maior ou igual a 1.
KIKWI-044Estratégia de retry reconhecidaSe retryPolicy estiver presente, o campo strategy deve ser LINEAR ou EXPONENTIAL_BACKOFF.
KIKWI-045Intervalo inicial do backoff exponencialSe retryPolicy.strategy for EXPONENTIAL_BACKOFF, o campo initialInterval deve estar preenchido.

CALL_ACTIVITY_COORDINATOR​

IDRegraDescrição
KIKWI-047calledElement obrigatóriocalledElement não pode ser nulo/vazio.
KIKWI-052elementVariable requer collectionVariableelementVariable só é válido quando collectionVariable também está presente.

BOUNDARY_INTERRUPTIVE_CATCH_EVENT​

IDRegraDescrição
KIKWI-049Nó pai restrito a EXTERNAL_TASK ou TIMER_TASKUm 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-050Tipo de provedor obrigatórioTodo BOUNDARY_INTERRUPTIVE_CATCH_EVENT deve declarar providerType com um dos valores reconhecidos: STATIC, VARIABLE, BEAN ou TEMPLATE.

EVENT_CATCHER​

IDRegraDescrição
KIKWI-054Tipo de provedor obrigatórioTodo EVENT_CATCHER deve declarar providerType com um dos valores reconhecidos: STATIC, VARIABLE, BEAN ou TEMPLATE.
KIKWI-055Campo do provedor preenchidoConforme providerType: staticKey (STATIC), providerVariable (VARIABLE), providerBean resolvível a um CorrelationKeysProvider (BEAN), ou correlationTemplates não-vazio (TEMPLATE).
KIKWI-056GROUP incompatível com STATICcatchType: GROUP não pode combinar com providerType: STATIC — STATIC sempre resolve exatamente 1 chave, incompatível com o scatter-gather de GROUP.
KIKWI-057boundaryEventIds restrito a timersUm 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​

IDRegraDescrição
KIKWI-058Tipo de provedor obrigatório + campo correspondenteMesma 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​

IDRegraDescrição
KIKWI-059boundaryEventIds restrito a timers e catch eventUm 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.

IDRegraDescrição
KIKWI-060Declaração bem-formadaToda entrada de variableDeclarations tem key não-vazia e única no processo, label não-vazio e format preenchido.
KIKWI-061Opções só (e sempre) em selectsSINGLE_SELECT/MULTI_SELECT exigem options não-vazio, com value não-vazio e único; qualquer outro formato rejeita options.
KIKWI-062MONEY com moedaformat: MONEY exige currency ISO-4217 válida (java.util.Currency).
KIKWI-063Regex seguro e aplicávelvalidationRegex só em SHORT_TEXT/LONG_TEXT, com no máximo 512 caracteres, e precisa compilar.
KIKWI-064Vínculo referencia o catálogoTodo variableBindings.inputs[]/outputs[] referencia uma key declarada em variableDeclarations, no máximo uma vez por lista.
KIKWI-065Sem inputs em EXECUTABLE_TASKEXECUTABLE_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 collectionVariable de um CALL_ACTIVITY_COORDINATOR resolva para uma List em 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 seu id (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 em boundaryEventIds de algum nó (KIKWI-030) — um nó órfão nunca executa.
  • Só DEFAULT_END_EVENT, JOIN_GATEWAY e BOUNDARY_ERROR_HANDLER ficam sem saída (KIKWI-006), e um DEFAULT_END_EVENT nã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_TASK não declara executor (KIKWI-013) — o campo é ignorado nesse tipo de nó.
  • Todo EXCLUSIVE_GATEWAY tem uma aresta isDefault: true (KIKWI-022) e, se a resposta puder ser null, uma aresta handlesNull: true (KIKWI-023) — sem elas, uma resposta não prevista vira IllegalStateException em execução.
  • Um PARALLEL_GATEWAY abre ao menos dois ramos (KIKWI-027), e todo ramo converge para o JOIN_GATEWAY declarado em targetJoinId (KIKWI-029) — um ramo que termina antes faz o join esperar para sempre.
  • schedulePolicy.maxOccurrences, quando declarado, é >= 1 (KIKWI-053) — 0 ou negativo nunca agenda um ciclo.
  • Uma retryPolicy LINEAR declara intervals com ao menos um elemento (KIKWI-046).
  • Um BOUNDARY_INTERRUPTIVE_CATCH_EVENT não declara catchType nem matchPolicy (KIKWI-051) — um evento de borda sempre resolve exatamente uma chave.

Ver também​