Skip to content

@memberjunction/queue

A server-side queue management framework for MemberJunction applications that provides database-backed task persistence, concurrent processing, and heartbeat monitoring.

The @memberjunction/queue package delivers a robust queuing system for background task processing. It manages task lifecycle from creation through execution, with automatic queue provisioning, configurable concurrency limits, and process-level health tracking.

graph TD
    A["QueueManager<br/>(Singleton)"] --> B["QueueBase<br/>(Abstract)"]
    B --> C["AIActionQueue"]
    B --> D["EntityAIActionQueue"]
    B --> E["Custom Queue<br/>(Your Implementation)"]

    A --> F["Queue Types<br/>(Database Metadata)"]
    A --> G["Queue Records<br/>(Process Tracking)"]
    B --> H["TaskBase<br/>(Individual Tasks)"]

    style A fill:#2d6a9f,stroke:#1a4971,color:#fff
    style B fill:#7c5295,stroke:#563a6b,color:#fff
    style C fill:#2d8659,stroke:#1a5c3a,color:#fff
    style D fill:#2d8659,stroke:#1a5c3a,color:#fff
    style E fill:#b8762f,stroke:#8a5722,color:#fff
    style F fill:#2d6a9f,stroke:#1a4971,color:#fff
    style G fill:#2d6a9f,stroke:#1a4971,color:#fff
    style H fill:#7c5295,stroke:#563a6b,color:#fff
Terminal window
npm install @memberjunction/queue
stateDiagram-v2
    [*] --> Pending: Task Created
    Pending --> InProgress: Queue Picks Up
    InProgress --> Complete: ProcessTask Succeeds
    InProgress --> Failed: ProcessTask Fails
    Pending --> Cancelled: External Cancel
sequenceDiagram
    participant Client
    participant QM as QueueManager
    participant QB as QueueBase
    participant DB as Database

    Client->>QM: AddTask(type, data, options)
    QM->>QM: Find or create queue for type
    QM->>DB: Save QueueTask record (Pending)
    QM->>QB: AddTask(taskBase)
    QB->>QB: ProcessTasks() loop (250ms interval)
    QB->>QB: Check concurrency (max 3 tasks)
    QB->>QB: StartTask(task)
    QB->>QB: ProcessTask(task) [abstract]
    QB->>DB: Update QueueTask status
    QB-->>Client: TaskResult

The QueueManager is a singleton that coordinates all active queues. It auto-creates queue instances per type and captures process-level metadata (PID, hostname, network interfaces) for monitoring.

import { QueueManager } from '@memberjunction/queue';
// Initialize (typically at application startup)
await QueueManager.Config(contextUser);
// Add a task by queue type name
const task = await QueueManager.AddTask(
'Email Notification',
{ recipient: 'user@example.com', subject: 'Welcome' },
{ priority: 1 },
contextUser
);
if (task) {
console.log(`Task created: ${task.ID}`);
}

Abstract base class for all queue implementations. Subclasses implement ProcessTask() to define task execution logic.

import { QueueBase, TaskBase, TaskResult } from '@memberjunction/queue';
import { RegisterClass } from '@memberjunction/global';
import { UserInfo } from '@memberjunction/core';
@RegisterClass(QueueBase, 'Email Notification')
export class EmailNotificationQueue extends QueueBase {
protected async ProcessTask(
task: TaskBase,
contextUser: UserInfo
): Promise<TaskResult> {
const { recipient, subject, body } = task.Data;
await sendEmail(recipient, subject, body);
return {
success: true,
userMessage: 'Email sent successfully',
output: { sentAt: new Date() },
exception: null
};
}
}

Represents an individual task with its payload, options, and database-backed record.

PropertyTypeDescription
IDstringUnique task identifier from database
StatusTaskStatusCurrent status (Pending, InProgress, Complete, Failed, Cancelled)
DataobjectTask payload data
OptionsTaskOptionsConfiguration (e.g., priority)
TaskRecordQueueTaskEntityUnderlying database entity

Returned by ProcessTask() to communicate outcome.

PropertyTypeDescription
successbooleanWhether the task completed successfully
userMessagestringHuman-readable result message
outputobjectTask output data
exceptionobjectError details if failed

Processes AI actions through the MemberJunction AI Engine.

const task = await QueueManager.AddTask(
'AI Action',
{ actionName: 'GenerateText', prompt: 'Summarize this document' },
{},
contextUser
);

Processes entity-specific AI actions.

const task = await QueueManager.AddTask(
'Entity AI Action',
{ entityName: 'Products', entityID: '123', actionName: 'GenerateDescription' },
{},
contextUser
);

Queue behavior is controlled through constructor parameters:

ParameterDefaultDescription
_maxTasks3Maximum concurrent tasks per queue
_checkInterval250Polling interval in milliseconds

The queue system persists state across three tables:

TablePurpose
__mj.QueueTypeDefines available queue types
__mj.QueueTracks active queue instances with process info and heartbeat
__mj.QueueTaskStores individual tasks with status, data, and output
PackagePurpose
@memberjunction/coreEntity management and metadata
@memberjunction/globalClass registration and global state
@memberjunction/core-entitiesQueue and task entity types
@memberjunction/aiAI functionality for built-in queues
@memberjunction/aiengineAI Engine integration

ISC