Pular para o conteúdo principal

Anatomia de um Processo

Um processo Kikwiflow é um único arquivo JSON. Este documento descreve seus campos de topo, o catálogo de tipos de nó disponíveis, e os campos de uma conexão (sequence flow) entre nós.

Pense na planta baixa de uma casa

A definição JSON de um processo é a planta baixa: ela descreve os cômodos (nós) e as portas que os conectam (sequence flows), mas não decide sozinha o que acontece dentro de cada cômodo. O que acontece dentro é papel do TaskHandler que ocupa aquele nó — a planta só garante que, saindo de um cômodo, você sabe exatamente para qual porta ir em seguida. A analogia para de funcionar quando o cômodo decide sozinho para onde a próxima porta leva — é exatamente isso que um gateway faz, e nenhuma planta baixa real toma essa decisão em tempo real.

Campos de topo

O processo de abertura de conta do tutorial, como o Craft o exporta, ilustra os campos de topo:

{
"key": "abertura-de-conta",
"name": "Abertura de Conta Digital",
"description": "",
"extensionProperties": {},
"flowNodes": { "...": "..." },
"defaultStartPoint": "43ee89f9-17c8-4d93-84dc-bae52ed7054d"
}
CampoPapel
keyIdentificador estável do processo, usado por KikwiflowEngine.startProcess().byKey(...). Reimplantar o mesmo key atualiza a definição para novas instâncias; instâncias já em execução continuam na versão com a qual começaram.
nameNome legível, para exibição em ferramentas de operação/observabilidade — é o que aparece no Craft e no Monitor.
flowNodesMapa de id do nó → definição do nó. Cada nó é indexado pelo próprio id — não por posição em uma lista.
defaultStartPointO id do nó por onde toda nova instância começa. Obrigatório — a inicialização falha se apontar para um nó inexistente.
extensionPropertiesMapa livre de string→string, para metadados que sua aplicação queira anexar ao processo (ex.: limiares de SLA) sem que o motor precise entender o significado.

Catálogo de tipos de nó

typePapel
DEFAULT_START_EVENTPonto de entrada de uma instância. Toda definição precisa de pelo menos um, referenciado por defaultStartPoint.
DEFAULT_END_EVENTFim de um ramo de execução. outgoing vazio.
EXECUTABLE_TASKExecuta lógica de negócio síncrona, via TaskHandler. Ver Tarefas Executáveis.
EXTERNAL_TASKEspera a conclusão de algo fora do controle direto do motor (humano, sistema externo). Ver Tarefas Externas e Workers.
EXCLUSIVE_GATEWAYRoteia para exatamente um dos ramos de saída, com base em uma decisão. Ver Decisões e Gateways.
PARALLEL_GATEWAY / JOIN_GATEWAYFan-out (segue todos os ramos de saída simultaneamente) e fan-in (espera todos os ramos pendentes antes de prosseguir). Ver Processamento Paralelo.
BOUNDARY_INTERRUPTIVE_TIMER / BOUNDARY_NON_INTERRUPTIVE_TIMERTimers de borda anexados a uma tarefa. Ver Timers e Prazos.
BOUNDARY_ERROR_HANDLERCaptura um erro de negócio lançado pelo nó ao qual está anexado. Ver Tratando Erros de Negócio.

Conexões (sequence flows)

Cada nó declara sua lista outgoing de conexões para os próximos nós:

{
"id": "flow-1",
"name": "",
"targetNodeId": "PROXIMO_NO",
"transitionType": "automated",
"isDefault": false,
"extensionProperties": {}
}
CampoPapel
targetNodeIdO id do próximo nó — precisa existir em flowNodes.
isDefaultSó é relevante em gateways de decisão: marca a aresta a seguir quando nenhuma outra condição casar. No máximo uma aresta isDefault: true por gateway.
expectedAnswerSó é relevante em EXCLUSIVE_GATEWAY: a aresta é seguida quando a decisão resolvida for igual a este valor (comparação exata de string).
handlesNullSó é relevante em EXCLUSIVE_GATEWAY: a aresta é seguida quando a decisão resolvida for null.

Detalhes de roteamento e do casamento de expectedAnswer/isDefault/handlesNull estão em Decisões e Gateways.

commitBefore e commitAfter: o que significam para você

Todo nó pode declarar commitBefore/commitAfter (booleanos, default false). Na prática, para quem desenha o processo, isso responde a uma pergunta simples: este nó precisa sobreviver a uma reinicialização da aplicação antes ou depois de executar?

  • commitBefore: true — o motor persiste o estado da instância antes de executar aquele nó, e a execução daquele ponto em diante passa a ser assíncrona (processada por um worker interno em segundo plano, não na mesma chamada que iniciou o processo). Use isso em nós que podem demorar, falhar e precisar de retry, ou que começam um ramo paralelo.
  • Sem commitBefore em nenhum nó do caminho, o processo inteiro roda de forma síncrona, dentro da mesma chamada Java que o iniciou — como o processo de abertura de conta do tutorial, que só cruza uma fronteira assíncrona ao esperar a EXTERNAL_TASK (uma espera nunca é síncrona, por definição: ninguém bloqueia uma thread esperando um analista de crédito bater o martelo).

Isso é o suficiente para decidir quando usar commitBefore ao modelar um processo. O mecanismo interno completo (filas de trabalho, UnitOfWork, quando o motor decide cruzar essa fronteira sozinho — como em PARALLEL_GATEWAY, que sempre é assíncrono) está documentado em Execução Síncrona e Assíncrona, para quem quiser entender o motor por dentro.

Próximo passo

Com a forma do processo entendida, o próximo passo é a etapa que faz o trabalho de verdade quando o fluxo não está esperando ninguém: Tarefas Executáveis.