Skip to content

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 → executes

No dependency on BOOST.Middleware or BOOST.DeliveryBoy

The caller provides DSLContext and tenantUUID. Secretary only depends on:

  • BoostMiddleware 2.0.5 (UuidUtils)
  • BOOST.Model 1.0.1 (jOOQ table/record classes)
  • qpid-jms-client 2.10.0 (JMS)
  • jooq 3.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

ServiceUse caseDSLContexttenantUUID
IdentityPublic signup emailsMaster tenant DSLMaster tenant UUID
PortalTenant-specific invites, documentsTenant DSL (via CustomerDataSource)That tenant's UUID
PortalJob execution (existing jobs)Tenant UUID
PortalMQTT CRUD relayTenant 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: sendEmail creates an audit trail in sys_jobs before 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 sending

Consumers (Controllers Using Secretary)

ControllerMethods UsedPurpose
SalesOrderControllerprocessJobInvoice/document generation
SalesInvoiceControllerprocessJobInvoice automation
PurchaseOrderControllerprocessJobPO document generation
PrintControllersendMqttMessageLabel printing (ZPL via MQTT)
InventoryControllersendMqttMessageDevice sync
RegistrationControllersendEmailSignup confirmation emails
DocumentApprovalFlowControllerprocessJobWorkflow automation

Queue Destinations

QueueTarget ServicePurpose
boost.dispatcher.jobsBOOST.DispatcherJob execution + MQTT relay