Pular para conteúdo

Aula 18 - Integração de DMN com Motores de Processo BPMN ⚙️

Objetivo Pedagógico

Objetivo: Conectar modelos de decisão DMN 1.3 a fluxos operacionais de processos BPMN 2.0 através da tarefa nativa Business Rule Task no motor Camunda, orquestrando fluxos condicionais baseados no resultado da decisão.


📑 1. Fundamentos Teóricos & Análise Técnica

Processos de negócio (BPMN) e regras de decisão (DMN) possuem propósitos complementares: o BPMN responde à pergunta "O que fazer e quando?" (orquestração temporal e delegação de tarefas), enquanto o DMN responde à pergunta "Como decidir?" (lógica determinística de regras).

A união arquitetural entre as duas especificações resolve a poluição clássica de processos: 1. O Antipadrão do Gateway Spaghetti: - Modelar decisões complexas utilizando dezenas de gateways exclusivos (XOR) no BPMN resulta em diagramas caóticos e ilegíveis (Spaghetti Process). 2. A Tarefa de Regra de Negócio (Business Rule Task): - Elemento padrão do BPMN (representado por uma tabela no canto superior esquerdo da atividade) que invoca diretamente o motor DMN de forma síncrona. - O processo passa as variáveis de instância como contexto de entrada para a tabela DMN. O motor DMN avalia as regras e devolve um mapa de variáveis de volta ao processo. 3. Decisões Orientadas a Roteamento em Camunda: - Os gateways subsequentes do BPMN tornam-se mínimos e elegantes, inspecionando apenas uma variável semântica de saída retornada pelo DMN (ex: decisao.status == 'APROVADO').

📐 Arquitetura Conceitual & Diagrama de Fluxo

graph LR
    Start([Início do Processo]) --> Collect["User Task: Coleta de Documentos"]
    Collect --> RuleTask[["Business Rule Task: Executa Tabela DMN"]]
    RuleTask --> Gate{"Status da Decisão?"}
    Gate -- APROVADO --> AutoApprove["Service Task: Liberar Pagamento"]
    Gate -- ANALISE_MANUAL --> ManualTriage["User Task: Parecer do Gerente"]
    Gate -- REJEITADO --> RejectTask["Send Task: Notificar Recusa"]
    AutoApprove --> End([Fim])
    ManualTriage --> End
    RejectTask --> End
    style Start fill:#e1f5fe,stroke:#01579b
    style RuleTask fill:#fff3e0,stroke:#e65100
    style Gate fill:#f3e5f5,stroke:#7b1fa2
    style AutoApprove fill:#e8f5e9,stroke:#2e7d32
    style RejectTask fill:#ffebee,stroke:#c62828

🔍 Pilares e Diretrizes Técnicas

Nesta unidade, aprofundamos os seguintes conceitos fundamentais: - Despoluição de Processos BPMN: Substituição de redes intrincadas de gateways lógicos por uma única chamada atômica ao motor DMN. - Manutenção Independente: Especialistas de crédito podem alterar taxas e faixas de score no DMN sem alterar o fluxo de tarefas do BPMN. - Mapeamento Automático de Variáveis: Injeção transparente de payloads JSON do processo na memória de execução da tabela DMN. - Auditoria de Decisões em Tempo Real: Histórico unificado no Camunda Cockpit rastreando quais regras exatas foram disparadas em cada instância.


🛠️ 2. Implementação Prática em Camunda Platform, BPMN 2.0 e Business Rule Task

Abaixo está a implementação técnica de referência, estruturada com padrões de engenharia de software e foco em robustez:

// processo_com_dmn.bpmn (Fragmento BPMN 2.0 Conectando Business Rule Task)
<bpmn:businessRuleTask id="Task_AvaliarRisco" 
                       name="Avaliar Risco via DMN" 
                       camunda:decisionRef="DecisaoScore"
                       camunda:resultVariable="resultadoDecisao"
                       camunda:mapDecisionResult="singleResult">
  <bpmn:incoming>Flow_DocumentosColetados</bpmn:incoming>
  <bpmn:outgoing>Flow_ParaGateway</bpmn:outgoing>
</bpmn:businessRuleTask>

<bpmn:exclusiveGateway id="Gateway_RoteamentoDecisao" name="Roteamento">
  <bpmn:incoming>Flow_ParaGateway</bpmn:incoming>
  <bpmn:outgoing>Flow_Aprovado</bpmn:outgoing>
  <bpmn:outgoing>Flow_Rejeitado</bpmn:outgoing>
</bpmn:exclusiveGateway>

<bpmn:sequenceFlow id="Flow_Aprovado" name="Aprovado" sourceRef="Gateway_RoteamentoDecisao" targetRef="Task_LiberarCredito">
  <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">
    ${resultadoDecisao.status == 'APROVADO_VIP' || resultadoDecisao.status == 'APROVADO_PADRAO'}
  </bpmn:conditionExpression>
</bpmn:sequenceFlow>

💡 Análise Passo a Passo do Código

  1. Propriedade camunda:decisionRef: Aponta o identificador exato da tabela DMN versionada no motor.
  2. Mapeamento singleResult: Converte a linha satisfeita da tabela em um mapa simples acessível por expressões JUEL no BPMN.
  3. Condição Declarativa ${...}: Mantém a lógica do gateway focada exclusivamente na rota sem embutir regras de crédito.

🎯 3. Próximos Passos & Sequência Didática