Parte Ii - Java Com Apache Kafka
Visão Geral
Esta parte mostra como integrar aplicações Java ao Apache Kafka, cobrindo desde a configuração do cliente até exemplos práticos de producers e consumers.
Estrutura de Pastas e Artefatos
Os principais arquivos e diretórios desta parte estão em parte2-java/:
-
docker-compose.yml: ambiente Kafka para testes locais
-
pom.xml: dependências Maven do projeto Java
-
src/main/java/com/mulato/: código-fonte dos Producers e Consumers
-
src/test/java/com/mulato/: testes automatizados
-
target/: arquivos compilados e JAR gerado após build
Consulte cada pasta para exemplos completos e adapte conforme seu ambiente.
Configuração do Ambiente Java
-
Java 11+ (recomendado Java 17+)
-
Gerenciador de dependências: Maven ou Gradle
-
Dependência principal: org.apache.kafka:kafka-clients
Exemplo de dependência Maven
\<dependency>
\<groupId>org.apache.kafka\</groupId>
\<artifactId>kafka-clients\</artifactId>
\<version>3.7.0\</version>
\</dependency>
Producer em Java
Exemplo básico de envio de mensagens para um tópico Kafka:
Properties props = new Properties();
props.put(\"bootstrap.servers\", \"localhost:9092\");
props.put(\"key.serializer\", \"org.apache.kafka.common.serialization.StringSerializer\");
props.put(\"value.serializer\", \"org.apache.kafka.common.serialization.StringSerializer\");
KafkaProducer\<String, String> producer = new KafkaProducer\<>(props);
ProducerRecord\<String, String> record = new ProducerRecord\<>(\"meu-topico\", \"chave\", \"mensagem\");
producer.send(record);
producer.close();
Consumer em Java
Exemplo básico de leitura de mensagens de um tópico:
Properties props = new Properties();
props.put(\"bootstrap.servers\", \"localhost:9092\");
props.put(\"group.id\", \"meu-grupo\");
props.put(\"key.deserializer\", \"org.apache.kafka.common.serialization.StringDeserializer\");
props.put(\"value.deserializer\", \"org.apache.kafka.common.serialization.StringDeserializer\");
KafkaConsumer\<String, String> consumer = new KafkaConsumer\<>(props);
consumer.subscribe(Collections.singletonList(\"meu-topico\"));
while (true) {
ConsumerRecords\<String, String> records = consumer.poll(Duration.ofMillis(100));
for (ConsumerRecord\<String, String> record : records) {
System.out.printf(\"offset = %d, key = %s, value = %s%n\", record.offset(), record.key(), record.value());
}
}
Exemplo Prático: Producer e Consumer em Java
A seguir, você encontra exemplos didáticos de Producer e Consumer em Java, ideais para quem está começando a integrar aplicações com o Apache Kafka. Os arquivos completos estão em:
parte2-java/src/main/java/com/mulato/PedidoProducer.java
e
parte2-java/src/main/java/com/mulato/PedidoConsumer.java
Como executar os exemplos
1.Garanta que o Kafka está rodando em localhost:9092
Utilize o docker-compose.yml fornecido na pasta parte2-java/ para subir o ambiente local rapidamente:
docker-compose up -d
2.Compile o projeto Java com Maven
O projeto já possui um pom.xml pronto com todas as dependências necessárias. Basta rodar:
mvn clean compile
3.Execute o Producer para enviar mensagens
mvn exec:java -Dexec.mainClass=\"com.mulato.PedidoProducer\"
O Producer simula o envio de pedidos para o tópico Kafka.
4.Execute o Consumer para ler as mensagens
mvn exec:java -Dexec.mainClass=\"com.mulato.PedidoConsumer\"
O Consumer consome e imprime os pedidos recebidos.
Producer Java --- Enviando pedidos
O Producer é responsável por publicar mensagens (pedidos) em um tópico Kafka. Veja um exemplo básico:
Properties props = new Properties();
props.put(\"bootstrap.servers\", \"localhost:9092\");
props.put(\"key.serializer\", \"org.apache.kafka.common.serialization.StringSerializer\");
props.put(\"value.serializer\", \"org.apache.kafka.common.serialization.StringSerializer\");
KafkaProducer\<String, String> producer = new KafkaProducer\<>(props);
ProducerRecord\<String, String> record = new ProducerRecord\<>(\"meu-topico\", \"chave\", \"mensagem\");
producer.send(record);
producer.close();
Consumer Java --- Lendo pedidos do tópico
O Consumer é responsável por ler as mensagens publicadas no tópico. Veja um exemplo básico:
Properties props = new Properties();
props.put(\"bootstrap.servers\", \"localhost:9092\");
props.put(\"group.id\", \"meu-grupo\");
props.put(\"key.deserializer\", \"org.apache.kafka.common.serialization.StringDeserializer\");
props.put(\"value.deserializer\", \"org.apache.kafka.common.serialization.StringDeserializer\");
KafkaConsumer\<String, String> consumer = new KafkaConsumer\<>(props);
consumer.subscribe(Collections.singletonList(\"meu-topico\"));
while (true) {
ConsumerRecords\<String, String> records = consumer.poll(Duration.ofMillis(100));
for (ConsumerRecord\<String, String> record : records) {
System.out.printf(\"offset = %d, key = %s, value = %s%n\", record.offset(), record.key(), record.value());
}
}
Dica: Experimente rodar múltiplos consumers no mesmo grupo para ver como o Kafka distribui as mensagens entre eles.
Esses exemplos são apenas para fins didáticos e funcionam em ambientes locais com o Kafka rodando no padrão (localhost:9092).
Teste Integrado: Producer e Consumer na Prática
Para garantir que sua aplicação Java está realmente se comunicando com o Kafka, é fundamental realizar testes de integração. O projeto já inclui um exemplo realista em
parte2-java/src/test/java/com/mulato/KafkaIntegrationTest.java
Esse teste automatizado:
-
Sobe o ambiente Kafka local (use docker-compose up -d na pasta parte2-java/).
-
Envia uma mensagem para o tópico pedidos usando um Producer.
-
Consome a mensagem usando um Consumer e valida se ela foi recebida corretamente.
Como executar o teste integrado
1.Suba o ambiente Kafka e Zookeeper
No terminal, dentro da pasta parte2-java/
docker-compose up -d
2.Garanta que o tópico pedidos existe
Se necessário, crie o tópico executando dentro do container Kafka:
docker exec -it \<nome_do_container_kafka> kafka-topics --bootstrap-server localhost:9092 --create --topic pedidos --partitions 1 --replication-factor 1
Use docker ps para descobrir o nome do container Kafka.
3.Execute o teste com Maven
mvn test
O teste irá:
-
Enviar uma mensagem para o tópico pedidos.
-
Consumir a mensagem e validar se ela foi recebida corretamente.
4.Finalize o ambiente
Após os testes, pare os containers:
docker-compose down
O teste é didático e pode ser adaptado para outros tópicos, mensagens ou cenários de integração.
Exercícios Práticos
Para praticar e aprofundar os conceitos desta parte, consulte também o arquivo auxiliar:
- exercicios-parte2.md --- Exercícios práticos de integração Java + Kafka, implementação de Producer/Consumer, testes e espaço para anotações.
Boas Práticas
-
Use consumer groups para escalabilidade
-
Gerencie offsets de forma adequada (automático/manual)
-
Implemente tratamento de exceções e retries
-
Utilize serialização adequada (String, JSON, Avro)
Exercícios Sugeridos
-
Crie um projeto Java com Maven ou Gradle
-
Implemente um producer que envia mensagens simulando pedidos
-
Implemente um consumer que lê e imprime esses pedidos
-
Experimente usar consumer groups e múltiplas partições
Recursos Recomendados
-
Exemplos oficiais: https://kafka.apache.org/quickstart
Código-Fonte e Exemplos
Todo o conteúdo, exemplos práticos e arquivos de configuração desta parte estão disponíveis no repositório oficial do projeto no GitHub:
🔗 github.com/chmulato/kafka-java-mastery
Acesse, explore e contribua!