← Back to scenarios
ScenarioCatalog DB

Job queue processing

Store jobs as commands so they can be submitted now and executed later by a worker.

Problem

A task runner must accept work independently of when a worker executes it, while keeping queue infrastructure decoupled from the details of each job.

Related patterns

Implementations

Command

TypeScriptApplication

Command in TypeScript

Encapsulates document actions as objects so an editor can execute, queue, and undo operations without knowing their implementation details.

TypeScript
interface Command {
  execute(): void;
  undo(): void;
}

class Document {
  private content = "";

  append(text: string) {
    this.content += text;
  }

  removeLast(count: number) {
    this.content = this.content.slice(0, -count);
  }

  print() {
    console.log(this.content);
  }
}

class AppendTextCommand implements Command {
  constructor(
    private readonly document: Document,
    private readonly text: string,
  ) {}

  execute() {
    this.document.append(this.text);
  }

  undo() {
    this.document.removeLast(this.text.length);
  }
}

class Editor {
  private readonly history: Command[] = [];

  run(command: Command) {
    command.execute();
    this.history.push(command);
  }

  undo() {
    this.history.pop()?.undo();
  }
}

const document = new Document();
const editor = new Editor();

editor.run(new AppendTextCommand(document, "Hello, "));
editor.run(new AppendTextCommand(document, "world!"));

document.print();

editor.undo();
document.print();

Associated technologies