BOOST.Secretary
A standalone shared library that any BOOST service can use to create job records in the database and send trigger messages to the BOOST.Dispatcher queue.
Maven coordinates: com.luqon.boost:secretary:1.0.0
Architecture
Any service (Portal, Identity, etc.)
↓
Secretary.sendEmail(dsl, tenantUUID, to, from, subject, body, createdByUUID)
↓
┌─────────────────────────────────────────┐
│ 1. JobService.createEmailJob() │
│ INSERT sys_email_job_data │
│ INSERT sys_jobs │
│ │
│ 2. QueueClient.sendProcessJob() │
│ JMS → boost.dispatcher.jobs │
│ property: tenantUUID │
└─────────────────────────────────────────┘
↓
BOOST.Dispatcher picks up processJob trigger → executesNo dependency on BOOST.Middleware or BOOST.DeliveryBoy
The caller provides DSLContext and tenantUUID. Secretary only depends on:
BoostMiddleware2.0.5 (UuidUtils)BOOST.Model1.0.1 (jOOQ table/record classes)qpid-jms-client2.10.0 (JMS)jooq3.19.6
API
Secretary (high-level facade)
java
Secretary secretary = new Secretary(brokerUrl, queueName);
// Create job record in DB + send processJob trigger
String jobUUID = secretary.sendEmail(dsl, tenantUUID, to, from, subject, body, createdByUUID);
// Trigger execution of an existing job already in DB
secretary.processJob(tenantUUID, jobUUID);
// Trigger processing of all pending jobs for tenant
secretary.processPending(tenantUUID);
// MQTT relay (no DB record, passthrough to Dispatcher)
secretary.sendMqttMessage(tenantUUID, bodyJson);
secretary.shutdown();JobService (DB operations)
Static methods for creating job records — used by Secretary internally, but also available directly if you only need the DB part.
java
// Creates sys_email_job_data + sys_jobs, returns jobUUID
String jobUUID = JobService.createEmailJob(dsl, to, from, subject, body, createdByUUID);
// Creates sys_mqtt_job_data + sys_jobs, returns jobUUID
String jobUUID = JobService.createMqttJob(dsl, topic, payload, createdByUUID);QueueClient (JMS operations)
Low-level JMS client. Used by Secretary internally, but available if you only need the queue part.
java
QueueClient client = new QueueClient(brokerUrl, queueName);
client.sendProcessJob(tenantUUID, jobUUID);
client.sendProcessPending(tenantUUID);
client.sendMqttMessage(tenantUUID, bodyJson);
client.shutdown();Message Formats
All messages are sent to the boost.dispatcher.jobs queue with tenantUUID as a JMS string property.
processJob
json
{ "triggerType": "processJob", "jobUUID": "uuid-string" }processPending
json
{ "triggerType": "processPending" }mqttCRUD
json
{ "triggerType": "mqttCRUD", "body": { "topic": "...", ... } }Usage by Service
| Service | Use case | DSLContext | tenantUUID |
|---|---|---|---|
| Identity | Public signup emails | Master tenant DSL | Master tenant UUID |
| Portal | Tenant-specific invites, documents | Tenant DSL (via CustomerDataSource) | That tenant's UUID |
| Portal | Job execution (existing jobs) | — | Tenant UUID |
| Portal | MQTT CRUD relay | — | Tenant UUID |
Example: Identity (registration email)
java
// In ServerContext initialization
Secretary secretary = new Secretary(brokerUrl, "boost.dispatcher.jobs");
// In RegistrationController.registerUser()
secretary.sendEmail(masterDsl, masterTenantUUID, userEmail, fromAddress, subject, htmlBody, "SYSTEM");Example: Portal (trigger existing job)
java
// Replaces old: Secretary.sendJobForImmediateExecution(jobUUID, userUUID)
secretary.processJob(tenantUUID, jobUUID);Example: Portal (MQTT CRUD)
java
// Replaces old: Secretary.sendCRUDMessage(data, userUUID)
secretary.sendMqttMessage(tenantUUID, data.build().toString());Migration from Old Secretary
| Old API (BOOST.Middleware) | New API (BOOST.Secretary) |
|---|---|
Secretary.sendJobForImmediateExecution(jobUUID, userUUID) | secretary.processJob(tenantUUID, jobUUID) |
Secretary.sendCRUDMessage(data, userUUID) | secretary.sendMqttMessage(tenantUUID, bodyJson) |
Secretary.scheduleJob(jobUUID, userUUID, cron) | Cron scheduling stays with Dispatcher (separate mechanism) |
EmailPublisher.sendEmail(...) (Identity) | secretary.sendEmail(dsl, tenantUUID, ...) |
Key differences:
- Instance-based instead of static methods
- Caller provides tenantUUID instead of resolving from ServerProperties
- DB-first:
sendEmailcreates an audit trail insys_jobsbefore triggering execution - No dependency on request context — can be used from any service
Project Structure
src/main/java/com/luqon/boost/secretary/
├── Secretary.java # High-level facade (JobService + QueueClient)
├── JobService.java # DB operations (creates job records)
└── QueueClient.java # JMS connection + message sendingConsumers (Controllers Using Secretary)
| Controller | Methods Used | Purpose |
|---|---|---|
SalesOrderController | processJob | Invoice/document generation |
SalesInvoiceController | processJob | Invoice automation |
PurchaseOrderController | processJob | PO document generation |
PrintController | sendMqttMessage | Label printing (ZPL via MQTT) |
InventoryController | sendMqttMessage | Device sync |
RegistrationController | sendEmail | Signup confirmation emails |
DocumentApprovalFlowController | processJob | Workflow automation |
Queue Destinations
| Queue | Target Service | Purpose |
|---|---|---|
boost.dispatcher.jobs | BOOST.Dispatcher | Job execution + MQTT relay |