Spring Boot 3 + Spring Kafka demo showing:
- String producer/consumer on
my-topic - JSON producer/consumer for a
Userpayload onuser-topic
This project exposes REST endpoints that publish to Kafka, and Kafka listeners that log consumed messages.
- Java 17
- Spring Boot 3.5.7
- Spring Kafka
- Maven
src/main/java/com/example/springkafka/configKafkaProducerConfig.java: KafkaProducerFactoryandKafkaTemplatebeans. Creates topicuser-topic.KafkaConsumerConfig.java: KafkaConsumerFactoryand listener container factories.
src/main/java/com/example/springkafka/controllerKafkaController.java: REST endpoints for sending messages/users.
src/main/java/com/example/springkafka/serviceKafkaProducerService.java: sends string messages tomy-topic.KafkaConsumerService.java: consumes string messages frommy-topic.JsonProducer.java: sendsUserobjects touser-topic.JsonConsumer.java: consumesUserobjects fromuser-topic.
src/main/java/com/example/springkafka/modelUser.java: simple POJO for JSON payloads.
src/main/resources/application.properties: Kafka and app configuration.
my-topic(String)- Producer:
KafkaProducerService - Consumer:
KafkaConsumerService - Note: there is no NewTopic bean created for
my-topicin the config (commented out).
- Producer:
user-topic(JSONUser)- Producer:
JsonProducer - Consumer:
JsonConsumer - Created by
KafkaProducerConfig#userTopic()
- Producer:
There are two places where Kafka settings are defined:
application.properties(Spring Boot configuration)KafkaProducerConfigandKafkaConsumerConfig(hard-coded values)
The config classes currently hard-code:
bootstrap.serversaslocalhost:9092- group IDs (
my-consumer-group,user-consumer-group)
If you want centralized configuration, consider moving those values to
application.properties and injecting them into the config classes.
Prerequisites:
- Java 17
- Kafka broker running on
localhost:9092 - Maven (or use the Maven wrapper included in this repo)
Start Kafka (example):
- Start Zookeeper (if using Kafka in ZK mode)
- Start Kafka broker on
localhost:9092
Run the app:
./mvnw spring-boot:runOr:
mvn spring-boot:runThe app starts on http://localhost:8080.
POST /send?message=hello
Example:
curl -X POST "http://localhost:8080/send?message=hello"POST /senduser
Example:
curl -X POST "http://localhost:8080/senduser" \
-H "Content-Type: application/json" \
-d "{\"name\":\"Alice\",\"age\":30,\"email\":\"alice@example.com\"}"On publish:
Message sent: <message>Sent user: User [name=..., age=..., email=...]
On consume:
Received message: <message>Received user: User [name=..., age=..., email=...]
./mvnw test