Pular para o conteúdo principal

Visão Geral do Motor Kikwiflow

O Kikwiflow é um motor de orquestração de processos (workflow/BPM) construído do zero em Java 21, pensado para times de engenharia que precisam de automação de processos de negócio sem abrir mão de tudo que torna um código-base Java produtivo: tipagem forte, refatoração segura em IDE, testes unitários triviais e depuração com breakpoint. Esta seção descreve o funcionamento interno do motor — os componentes do kikwi-core e como eles colaboram para levar uma instância de processo do início ao fim. Você não precisa dela para usar o Kikwiflow (o Guia do Desenvolvedor cobre isso); ela serve para quem quer entender o porquê de cada comportamento ou está diagnosticando algo em produção.

Por que Kikwiflow existe​

Modelar processos em XML e resolver decisões com linguagens de expressão embutidas em strings funciona, mas cobra um preço em experiência de desenvolvimento: não há autocomplete confiável, a IDE não refatora o que está dentro de uma string, e depurar uma expressão que falhou em produção costuma significar ler stack traces que apontam para o motor, não para o seu código.

O Kikwiflow parte de uma escolha de design deliberada e diferente:

:::tip Filosofia central Um processo é um grafo de nós descrito em JSON. A lógica de cada nó é uma classe Java comum, registrada como bean Spring. Não há expression language, não há scripting embutido, não há XML. :::

Na prática, isso significa que:

  • Uma tarefa executável (EXECUTABLE_TASK) não aponta para uma expressão — aponta para o nome de um bean Spring que implementa a interface TaskHandler. Você escreve handle(ExecutionContext execution) como escreveria qualquer outro componente Spring, com acesso total a injeção de dependência, testes com Mockito e breakpoints do seu jeito habitual.
  • Uma decisão em um gateway exclusivo não é uma expressão booleana em uma string — é o retorno de um método resolve(EvaluationContext context) de uma classe que implementa AnswerProvider, tão testável quanto qualquer outra classe de domínio.
  • Cálculo de prazos dinâmicos de timer (DueDateProvider) e políticas de retry seguem o mesmo padrão: interface Java pequena, implementação livre, resolução por nome de bean em tempo de execução.

Essa escolha tem um preço — ela acopla a definição do processo ao classpath da aplicação que o executa — mas o retorno é um modelo de execução onde toda a lógica de negócio vive onde o resto do seu código já vive, sob controle de versão, revisão de código e cobertura de testes normais.

Camadas do motor​

O Kikwiflow é dividido em módulos com fronteiras de responsabilidade explícitas. Na sua aplicação você depende só dos starters (ver Instalação e Setup); os grupos abaixo servem para entender a execução:

CamadaMódulosResponsabilidade
Modelokikwi-modelRecords imutáveis: definição de processo (ProcessDefinition, FlowNodeDefinition e suas variantes), estado de execução (ProcessInstance, ExecutableTask, ExternalTask, Incident), enums de domínio.
Contratos (SPI)kikwi-execution-api, kikwi-runtime-persistence-api, kikwi-security-api, kikwi-lightweight-events-apiInterfaces que o motor consome e que aplicações/plugins implementam: TaskHandler, AnswerProvider, DueDateProvider, RetryPolicyEvaluator, KikwiEngineRepository, DeploymentSecurityManager, ExecutionEventListener.
Motor de execuçãokikwi-coreA implementação de fato: KikwiflowEngine (fachada), Navigator (roteamento), ProcessExecutionManager (loop de execução em memória), ContinuationService (fronteiras transacionais), TaskAcquirer/TaskExecutor (polling e despacho), FailureHandler (retry/incidentes).
Parsingkikwi-parser-jacksonDeserialização polimórfica do JSON .kikwi para o modelo de domínio, com dispatch por campo "type".
Persistênciakikwi-runtime-persistence-mongodb, kikwi-in-memory-addonsImplementações de KikwiEngineRepository: MongoDB para produção, com commitWork() transacional via ClientSession.withTransaction; em memória para testes e demos.
Integração Springkikwi-spring-boot-autoconfigure e módulos -starterFiação automática: resolve TaskHandler/AnswerProvider/DueDateProvider como beans Spring nomeados, expõe KikwiflowProperties, autodeploy de definições JSON do classpath.
API de gestãokikwi-management-rest*REST para consulta e operação: busca de instâncias, claim/complete de tarefas externas, retry de incidentes, SSE de estatísticas.

Cada uma dessas camadas é descrita em detalhe nas páginas seguintes desta seção.

CQRS como princípio arquitetural​

O motor separa explicitamente comando (mutação de estado) de consulta (leitura):

  • Lado de comando: KikwiflowEngine → KikwiEngineRepository (interface que estende CommandRepository e QueryRepository). Toda mutação de estado — criar/atualizar/deletar uma ProcessInstance, criar/apagar tarefas, registrar incidentes — passa por um único método transacional: commitWork(UnitOfWork).
  • Lado de consulta: QueryRepository expõe builders fluentes (createProcessInstanceQuery(), createExternalTaskQuery()), consumidos por kikwi-runtime-query-api/ExternalTaskQueryService e pela API REST de gestão. Consultas nunca passam pelo UnitOfWork.

Essa separação existe porque as duas cargas de trabalho têm perfis de acesso completamente diferentes: o lado de comando precisa de forte consistência transacional (mover uma instância de um nó para o próximo não pode deixar tarefas órfãs), enquanto o lado de consulta precisa de flexibilidade de filtros e paginação sem acoplar o schema interno de execução à experiência de busca do usuário final.

O que vem a seguir​

As próximas páginas cobrem, em ordem, os mecanismos concretos do motor:

  1. Modelo de Processo e Nós de Fluxo — anatomia de um .kikwi e a hierarquia de tipos de nó.
  2. Navegação e Gateways de Decisão — como o Navigator resolve o próximo passo.
  3. Timers e Agendamento — timers de borda e tarefas recorrentes.
  4. Retry e Resiliência — políticas de nova tentativa e incidentes.
  5. Execução Síncrona e Assíncrona — o modelo de fronteiras transacionais.
  6. Workers e Tarefas Externas — o poller TaskAcquirer e o ciclo de vida de ExternalTask.
  7. Tratamento de Erros de Negócio — ProcessErrorException e handlers de borda.
  8. Eventos e Observabilidade — eventos leves vs. padrão outbox.
  9. Persistência e Consistência Transacional — UnitOfWork e o contrato KikwiEngineRepository.
  10. Segurança e Multi-tenancy — SPIs de segurança e isolamento por tenant.
  11. Referência de Configuração — todas as propriedades kikwiflow.*, incluindo kikwiflow.monitor-ui.*.

Fechando a seção, Regras de Processo Válido lista o que o deploy de fato rejeita, e Catálogo de Variáveis e Contrato de Dados descreve como o motor valida as variáveis exigidas por cada etapa e descreve os formulários.

A cobertura dos tipos de correlação (EVENT_CATCHER, EVENT_THROWER, BOUNDARY_INTERRUPTIVE_CATCH_EVENT), do TIMER_TASK e dos subprocessos (CALL_ACTIVITY_COORDINATOR) está no Guia do Desenvolvedor, a partir de Event Catcher e Event Thrower.