Agent-skills-standard nestjs-scheduling
Implement distributed cron jobs with Redis-based locking and BullMQ offloading in NestJS. Use when adding @Cron scheduled tasks, preventing duplicate runs across pods, or delegating heavy work to queue workers. (triggers: **/*.service.ts, @Cron, CronExpression, ScheduleModule)
install
source · Clone the upstream repo
git clone https://github.com/HoangNguyen0403/agent-skills-standard
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/HoangNguyen0403/agent-skills-standard "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/nestjs/nestjs-scheduling" ~/.claude/skills/hoangnguyen0403-agent-skills-standard-nestjs-scheduling && rm -rf "$T"
manifest:
skills/nestjs/nestjs-scheduling/SKILL.mdsource content
Task Scheduling & Jobs
Priority: P1 (OPERATIONAL)
Workflow: Add Scheduled Task
- Register ScheduleModule — Import
in AppModule.ScheduleModule.forRoot() - Create cron handler — Decorate service method with
.@Cron(CronExpression.*) - Add distributed lock — Apply Redis lock decorator to prevent multi-pod duplication.
- Offload heavy work — Push job IDs to BullMQ; let workers process them.
- Wrap in try/catch — Uncaught exceptions in cron handlers crash entire Node process.
- Verify — Test with 2+ instances to confirm only one acquires lock.
Problem & Solution
- Problem:
runs on every instance. In K8s with 3 pods, your "Daily Report" runs 3 times.@Cron() - Solution: Distributed Locking using Redis.
- Pattern: Using decorator to wrap cron method.
- Logic:
(Redis Atomic Set).SET resource_name my_random_value NX PX 30000
Cron Decorator Pattern
- Implementation:
- Tools: Use
or custom Redis wrapper vianestjs-redlock
library.redlock
Cron-to-Queue Offload
Job Robustness
- Isolation: Never perform heavy processing inside Cron handler.
- Pattern: Cron -> Push Job ID to Queue (BullMQ) -> Worker processes it.
- Why: Cron schedulers can get blocked by Event Loop; Workers scalable.
- Error Handling: Wrap ALL cron logic in
. Uncaught exceptions in Cron job can crash entire Node process.try/catch
Anti-Patterns
- No unguarded cron logic: Always wrap in
; uncaught exceptions crash entire Node process.try/catch - No direct cron processing: Push to BullMQ queue; workers scalable, cron handlers not.
- No bare @Cron in multi-pod: Use distributed locking (redlock) to prevent duplicate concurrent runs.