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:

  1. Injetar RabbitTemplate e enviar mensagem JSON para exchange pedidos.exchange.

Resultado Esperado

Mensagem publicada com routing key 'pedidos.novos'.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_15_1_SeuNome
  2. 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:

  1. 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)

  1. Salve o arquivo como: Atividade_15_2_SeuNome
  2. 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:

  1. Configurar KafkaTemplate<String, Object> e enviar evento de faturamento para o tópico faturamento-events.

Resultado Esperado

Evento publicado no tópico Kafka com chave de partição baseada em clienteId.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_15_3_SeuNome
  2. 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:

  1. Configurar DefaultErrorHandler com 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)

  1. Salve o arquivo como: Atividade_15_4_SeuNome
  2. 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));
    }
}