Context Imutável
O SagaContext é o objeto que viaja entre os steps. Ele deve ser tratado como imutável para garantir previsibilidade e auditoria.
Por que Imutabilidade?
Sem Imutabilidade ( Errado)
public class PixContext {
private String blockId; // Mutável
public void setBlockId(String id) {
this.blockId = id; // <DocIcon name="alert" /> Mutação!
}
}
// No step...
private PixContext blockBalance(PixContext ctx) {
String blockId = balanceService.block(...);
ctx.setBlockId(blockId); // <DocIcon name="alert" /> Altera o objeto original
return ctx;
}
Problemas:
- Difícil rastrear quando o valor mudou
- Race conditions em cenários concorrentes
- Compensação pode ver valor inconsistente
- Log de auditoria não reflete estado real
Com Imutabilidade ( Correto)
public record PixContext(
String transactionId,
String dictKey,
BigDecimal amount,
String blockId // Imutável
) {
public PixContext withBlockId(String id) {
return new PixContext(transactionId, dictKey, amount, id);
}
}
// No step...
private PixContext blockBalance(PixContext ctx) {
String blockId = balanceService.block(...);
return ctx.withBlockId(blockId); // <DocIcon name="check" /> Retorna nova instância
}
Benefícios:
- Cada step recebe um snapshot do estado
- Fácil de debugar e auditar
- Thread-safe por design
- Compensação tem acesso ao estado correto