🧩 Exercícios: Mensageria Assíncrona com RabbitMQ e Kafka
Spec Backend Com Java E Springboot • Trilha Progressiva em 4 Níveis
🎯 Nível 1: Fundamentos
Problema 15.1 — Publicação de Mensagens no RabbitMQ com RabbitTemplate
Contexto: Publicação de Mensagens no RabbitMQ com RabbitTemplate no contexto de Mensageria Assíncrona com RabbitMQ e Kafka.
Requisitos de Execução:
- Injetar
RabbitTemplatee enviar mensagem JSON para exchangepedidos.exchange.
Resultado Esperado
Mensagem publicada com routing key 'pedidos.novos'.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_15_1_SeuNome - Envie na tarefa:
Atividade Cap 15 - Mensageria Assíncrona com RabbitMQ e Kafka
🔑 Gabarito de Código & Solução Comentada
// RabbitProducer.java
package com.empresa.api.messaging;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Service;
@Service
public class RabbitProducer {
private final RabbitTemplate rabbitTemplate;
public RabbitProducer(RabbitTemplate rabbitTemplate) {
this.rabbitTemplate = rabbitTemplate;
}
public void publicarPedido(Object pedido) {
rabbitTemplate.convertAndSend("pedidos.exchange", "pedidos.novos", pedido);
}
}
🔍 Nível 2: Prática
Problema 15.2 — Consumo com @RabbitListener e Confirmação Manual
Contexto: Consumo com @RabbitListener e Confirmação Manual no contexto de Mensageria Assíncrona com RabbitMQ e Kafka.
Requisitos de Execução:
- Criar método consumidor anotado com
@RabbitListener(queues = 'pedidos.queue').
Resultado Esperado
Mensagem consumida da fila e processada de forma assíncrona.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_15_2_SeuNome - Envie na tarefa:
Atividade Cap 15 - Mensageria Assíncrona com RabbitMQ e Kafka
🔑 Gabarito de Código & Solução Comentada
// RabbitConsumer.java
package com.empresa.api.messaging;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class RabbitConsumer {
@RabbitListener(queues = "pedidos.queue")
public void receberMensagem(String mensagem) {
System.out.println("MENSAGEM RECEBIDA: " + mensagem);
}
}
⚡ Nível 3: Integração
Problema 15.3 — Publicação de Eventos no Apache Kafka com KafkaTemplate
Contexto: Publicação de Eventos no Apache Kafka com KafkaTemplate no contexto de Mensageria Assíncrona com RabbitMQ e Kafka.
Requisitos de Execução:
- Configurar
KafkaTemplate<String, Object>e enviar evento de faturamento para o tópicofaturamento-events.
Resultado Esperado
Evento publicado no tópico Kafka com chave de partição baseada em clienteId.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_15_3_SeuNome - Envie na tarefa:
Atividade Cap 15 - Mensageria Assíncrona com RabbitMQ e Kafka
🔑 Gabarito de Código & Solução Comentada
// KafkaProducerService.java
package com.empresa.api.messaging;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;
@Service
public class KafkaProducerService {
private final KafkaTemplate<String, String> kafkaTemplate;
public KafkaProducerService(KafkaTemplate<String, String> kafkaTemplate) {
this.kafkaTemplate = kafkaTemplate;
}
public void enviarEvento(String topico, String chave, String payload) {
kafkaTemplate.send(topico, chave, payload);
}
}
🏆 Nível 4: Desafio Corporativo
Problema 15.4 — Dead Letter Queue (DLQ) e Retry com Backoff no Kafka
Contexto: Dead Letter Queue (DLQ) e Retry com Backoff no Kafka no contexto de Mensageria Assíncrona com RabbitMQ e Kafka.
Requisitos de Execução:
- Configurar
DefaultErrorHandlercom 3 retries e envio automático para tópico DLT (Dead Letter Topic).
Resultado Esperado
Mensagens com erro persistente enviadas para 'faturamento-events.DLT'.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_15_4_SeuNome - Envie na tarefa:
Atividade Cap 15 - Mensageria Assíncrona com RabbitMQ e Kafka
🔑 Gabarito de Código & Solução Comentada
// KafkaErrorHandlerConfig.java
package com.empresa.api.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.listener.DefaultErrorHandler;
import org.springframework.util.backoff.FixedBackOff;
@Configuration
public class KafkaErrorHandlerConfig {
@Bean
public DefaultErrorHandler errorHandler() {
return new DefaultErrorHandler(new FixedBackOff(1000L, 3L));
}
}