Overview
Client Initializers run when a client successfully connects to HiveMQ. They enable you to:- Set Default Permissions - Define initial publish and subscribe permissions
- Register Per-Client Interceptors - Add client-specific packet interceptors
- Initialize Client Context - Store client-specific data and state
- React to Connection Events - Perform actions when clients connect
Initialization Flow
- Client completes authentication successfully
- HiveMQ calls
ClientInitializer.initialize()for each registered initializer - Initializer configures client context, permissions, and interceptors
- CONNACK is sent to client
- Client session is fully established
PluginInitializerHandler.java:57 for internal client initialization handler.
Implementing a Client Initializer
Step 1: Create and Register Initializer
Initializers.java:34 for initializer registration interface.
Step 2: Implement ClientInitializer
Setting Default Permissions
Configure initial publish and subscribe permissions:Permission Types
DefaultPermission.Type.PUBLISH- Allow publishing to topicsDefaultPermission.Type.SUBSCRIBE- Allow subscribing to topic filters- Both can be combined for read/write access
Advanced Permissions
Set permissions with QoS limits:Registering Client-Specific Interceptors
Add interceptors that only apply to specific clients:Accessing Client Information
Get client and connection details during initialization:Role-Based Initialization
Configure clients based on roles or attributes:Database-Driven Initialization
Load client configuration from a database:Logging and Metrics
Track client initialization for monitoring:Best Practices
Performance
- Keep Initialization Fast - Don’t block client connections with slow operations
- Avoid Blocking I/O - Use async operations for database lookups
- Cache Configuration - Cache role and permission mappings
- Minimize Permission Count - Use topic patterns instead of many individual permissions
Security
- Default Deny - Start with no permissions and add only what’s needed
- Validate Client IDs - Sanitize client IDs before using in topic patterns
- Audit Initialization - Log permission grants for security auditing
- Separate Concerns - Keep authentication and authorization separate
Maintainability
- Externalize Configuration - Load permissions from config files or databases
- Document Permissions - Clearly document default permission model
- Test Initialization - Test initialization for different client types
- Version Permissions - Track permission changes over time
Multiple Initializers
When multiple extensions register initializers:- All initializers execute in extension priority order
- Each initializer can add to default permissions
- Later initializers can override earlier interceptors
- Permissions are cumulative across initializers
Initializers.java:40 for client initializer map.
Testing Client Initialization
Test initialization with MQTT clients:Troubleshooting
Initializer Not Called
- Verify initializer is registered in
extensionStart() - Check that extension is loaded and started
- Ensure client authentication succeeds
- Review HiveMQ logs for initialization errors
Permissions Not Applied
- Check permission topic patterns match client usage
- Verify permission types (PUBLISH vs SUBSCRIBE)
- Review authorizer configuration (may override defaults)
- Enable debug logging for permission evaluation
Performance Issues
- Avoid blocking I/O during initialization
- Cache permission lookups
- Minimize number of interceptors registered
- Profile initialization time
PluginInitializerHandler.java:98 for CONNACK initialization trigger.
Next Steps
Authorization
Implement runtime authorization checks
Packet Interceptors
Intercept and modify MQTT packets
Authentication
Authenticate clients before initialization
Extension SDK
Learn more about the Extension SDK