Esta POC demonstra a implementação do padrão Mediator utilizando Spring Events para comunicação entre componentes e Resilience4j para tratamento de falhas com retry.
graph TD
A[PedidoService] -->|publica| B[PedidoCriadoEvent]
B -->|notifica| C[NotificacaoListener]
B -->|notifica| D[AuditoriaListener]
B -->|notifica| E[PedidoCriadoListener]
classDiagram
class ApplicationEvent {
<<Spring>>
}
class PedidoCriadoEvent {
-Pedido pedido
+PedidoCriadoEvent(source, pedido)
+getPedido()
}
ApplicationEvent <|-- PedidoCriadoEvent
classDiagram
class NotificacaoListener {
+aoCriarPedido(event)
}
class AuditoriaListener {
+registrarAuditoria(event)
}
class PedidoCriadoListener {
+handlePedidoCriadoEvent(event)
}
sequenceDiagram
participant PS as PedidoService
participant PE as PedidoCriadoEvent
participant NL as NotificacaoListener
participant AL as AuditoriaListener
participant PL as PedidoCriadoListener
PS->>PE: publica evento
PE->>NL: notifica listener
PE->>AL: notifica listener
PE->>PL: notifica listener
O Resilience4j está configurado com os seguintes parâmetros:
resilience4j:
retry:
instances:
pedidoListener:
maxAttempts: 3
waitDuration: 1s
enableExponentialBackoff: true
exponentialBackoffMultiplier: 2- maxAttempts: 3 tentativas antes de falhar
- waitDuration: 1 segundo de espera entre tentativas
- enableExponentialBackoff: ativado para aumentar o tempo de espera
- exponentialBackoffMultiplier: multiplicador de 2 para o backoff exponencial
A POC utiliza LocalStack para simular serviços AWS localmente. Os scripts de infraestrutura estão disponíveis na pasta infra-local:
list_queue.sh: Lista todas as filas SQS disponíveisread_dlq.sh: Lê as mensagens presentes na DLQ (Dead Letter Queue)
- Certifique-se de que o LocalStack está rodando
- Execute os scripts conforme necessário:
./infra-local/list_queue.sh
./infra-local/read_dlq.sh- Clone o repositório
- Inicie o LocalStack
- Execute a aplicação:
./mvnw spring-boot:run- Java 17
- Spring Boot
- Spring Events
- Resilience4j
- AWS SQS (simulado com LocalStack)
- Desacoplamento: Os componentes se comunicam através de eventos, reduzindo o acoplamento
- Resiliência: O mecanismo de retry garante maior robustez em caso de falhas temporárias
- Manutenibilidade: Código organizado e testável
- Escalabilidade: Fácil adicionar novos listeners para diferentes eventos