Small Java CLI tool that simulates many MQTT producers publishing JSON messages in parallel.
Each producer simulates a single MQTT device (for example, one sensor).
At runtime, the app:
- Parses CLI arguments into a
ProducerConfig. - Builds a payload filler string (repeated
A) sized to help reach a target message size. - Starts a fixed thread pool with one worker per producer.
- Connects each worker to the MQTT broker with a unique client ID.
- Publishes messages to
--topic/<producerId>using QoS 0. - Disconnects and closes each MQTT client after sending.
Each message is JSON and includes:
message_id(UUID)timestamp(UTC, nanosecond precision format)temperature(random double between 86 and 88, rounded to 2 decimals)payload(filler string)
- Java 17+
- Maven 3.8+ (or compatible)
- Reachable MQTT broker endpoint (for example
tcp://localhost:1883)
mvn clean packageThis creates a runnable shaded jar in target/.
Copy the created JAR from target/ into the docker project MqttLoadGenerator folder, then build the Docker image:
docker build -t mqttloadgenerator .Run the application container for Kafka:
docker run -it --rm --name mqttproducer /
--network kafka-docker_kafka_network /
mqttloadgenerator java -cp app.jar org.example.MqttLoadGenerator /
--broker=tcp://mqtt-broker:1883 /
--topic=mqtt/temp /
--producer-count=250 /
--messages-per-producer=1000 /
--delay-between-messages=50 /
--payload-size=512Run the application container for Pulsar:
docker run -it --rm --name mqttproducer /
--network pulsar-docker_pulsar_network /
mqttloadgenerator java -cp app.jar org.example.MqttLoadGenerator /
--broker=tcp://pulsar:1883 /
--topic=persistent://public/default/temp /
--producer-count=250 /
--messages-per-producer=1000 /
--delay-between-messages=50 /
--payload-size=512All arguments use --name=value format.
| Argument | Required | Default | Description |
|---|---|---|---|
--broker |
Yes | none | MQTT broker address. Example: tcp://localhost:1883 |
--topic |
Yes | none | Base topic. Each producer publishes to <topic>/<producerId> |
--producer-count |
No | 100 |
Number of concurrent producer workers |
--messages-per-producer |
No | 600 |
Number of messages each producer sends |
--delay-between-messages |
No | 1000 |
Delay in milliseconds between messages for each producer |
--payload-size |
No | 130 |
Target minimum size logic input for payload filler |
Validation and clamping behavior:
- Missing
--brokeror--topiccauses startup failure with an error message. --producer-countand--messages-per-producerare clamped to at least1.--delay-between-messagesis clamped to at least0.--payload-sizeis clamped to at least130.
- Total producers =
producer-count - Messages per producer =
messages-per-producer - Total messages attempted =
producer-count * messages-per-producer
Approximate per-producer duration:
random startup jitter (0-1499ms) + ((messages-per-producer - 1) * delay-between-messages)
Approximate produced messages per second (steady state, ignoring startup jitter):
produced-messages-per-second = producer-count * (1000 / delay-between-messages)