Skip to content

BOOST.Dispatcher

A multi-tenant job dispatch and processing system that routes messages from an AMQP queue to various handlers including email delivery, PDF generation, and MQTT-based data synchronization.

Architecture

ActiveMQ Queue → PersonalDispatcher.onMessage()

          DispatcherJob.parse()

         (jobType routing)

    ┌────────────┼────────────┐
    ↓                         ↓
documentAction              mqttCRUD
    ↓                         ↓
PDFJobFactory             MQTTService

  SysJobsRecord

EmailJob (Quartz)

MailProviderFactory

(SMTP / Mailgun / SES / SendGrid)

Multi-Tenancy

  • Each tenant gets its own PersonalDispatcher, Quartz scheduler, and database connection
  • Messages are filtered by tenantUUID JMS property
  • MQTT topics are hashed per-tenant using MD5
  • DispatcherBoss orchestrates dispatcher creation for all tenants

Prerequisites

  • Java (Maven project)
  • AMQP Message Broker (e.g., RabbitMQ)
  • MQTT Broker
  • MySQL Database (per-tenant + master)
  • ImageMagick (for PDF-related operations via BOOST.PDFBuilder)

Configuration

config.properties

properties
dispatcher_queue_name=boost.dispatcher.jobs
broker_url=amqp://172.16.200.32:5672
mqtt_host=tcp://172.16.200.158:1883
mqtt_username=BOOSTDispatcher
mqtt_password=****

quartz.properties

Quartz is configured with JDBC job store for persistent job scheduling.

hikari-*.properties

Multiple HikariCP connection pool configurations for master and tenant databases.

Job Types

documentAction

Generates a PDF from a template and sends it via email.

Flow:

  1. Fetches job definition from sys_jobs table
  2. Retrieves template from sys_templates
  3. Generates PDF using BOOST.PDFBuilder
  4. Resolves email recipients from sys_mail_destinations
  5. Sends email via configured provider
  6. Updates job status in sys_jobqueue

Job lifecycle: PENDING → COMPLETED / FAILED

mqttCRUD

Publishes data change notifications to MQTT topics.

MQTT Topic format: BOOST/{tenant_hash}/{tableName}

Message Format

Incoming JMS Message

json
{
  "jobType": "documentAction | mqttCRUD",
  "userUUID": "uuid-string",
  "tenantUUID": "tenant-uuid",
  "body": { }
}

Email Providers

ProviderStatusImplementation
SMTPImplementedGeneric SMTP with TLS/auth
MailgunImplementedREST API via OkHttp
SendGridPlaceholderNot yet implemented
AWS SESPlaceholderNot yet implemented

Provider configuration is stored per-tenant in the sys_mail_providers database table.

Checksum Sync System

A periodic background process (every 5 minutes via ChecksumPingJob) that:

  1. Queries entity tables for row counts, max timestamps, and XOR-based checksums
  2. Publishes checksums via MQTT to topic BOOST/{tenant_hash}/sync/ping
  3. Clients compare local checksums to detect stale data
  4. Clients request full sync when checksums don't match

Entities tracked: items, work_orders, persons, organizations (and others)

Database Tables

TablePurpose
sys_jobsJob definitions and templates
sys_job_dataJob execution data
sys_templatesPDF/email templates
sys_mail_destinationsEmail recipient configuration
sys_mail_providersPer-tenant email provider settings
sys_jobqueueJob execution status tracking
QRTZ_*Quartz scheduler persistence tables

Dependencies

DependencyVersionPurpose
quartz2.3.2Job scheduling
jooq3.19.6Type-safe SQL
qpid-jms-client2.5.0AMQP messaging
paho.mqtt1.2.5MQTT publishing
HikariCP5.1.0Connection pooling
jakarta.mail2.0.1Email sending
okhttp4.12.0HTTP client (Mailgun API)
pdfbox3.0.2PDF handling
BOOST.PDFBuilderinternalPDF generation from templates
BoostMiddlewareinternalShared BOOST utilities

Project Structure

src/main/java/com/luqon/dispatcher/
├── main/
│   ├── ScheduledSender.java        # Entry point
│   ├── DispatcherBoss.java          # Multi-tenant orchestrator
│   ├── PersonalDispatcher.java      # Per-tenant message listener
│   ├── DispatcherJob.java           # Job model
│   ├── DispatcherJobType.java       # Job type enum
│   ├── DataSourceInitializer.java   # Tenant DB initialization
│   ├── CustomerDataSource.java      # Tenant data wrapper
│   └── ActiveMQService.java         # JMS connection management
├── email/
│   ├── EmailJob.java                # Quartz job for sending email
│   ├── MailProvider.java            # Provider interface
│   ├── MailProviderFactory.java     # Provider factory
│   ├── MailProviderType.java        # Provider enum
│   ├── providers/
│   │   ├── SmtpProvider.java
│   │   └── MailgunProvider.java
│   └── config/
│       ├── MailProviderConfig.java
│       ├── SmtpConfig.java
│       └── MailgunConfig.java
├── PDF/
│   ├── PDFJobFactory.java           # Job creation & scheduling
│   └── JobQueueService.java         # Job lifecycle tracking
├── mqtt/
│   └── MQTTService.java             # MQTT publishing
├── sync/
│   ├── EntitySyncService.java       # Checksum generation
│   └── ChecksumPingJob.java         # Periodic sync ping
└── utils/
    ├── ChecksumUtils.java           # Hashing utilities
    └── SimpleCrypto.java            # Crypto operations

Running the Service

bash
java -cp target/classes com.luqon.dispatcher.main.ScheduledSender