/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.
$ npx -y skills add hoangnguyen0403/agent-skills-standard --skill nestjs-scheduling --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/nestjs-scheduling
Context preview
The summary Claude sees to decide when to auto-load this skill.
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.
SKILL.md
nestjs-scheduling.SKILL.mdname: nestjs-scheduling
description: 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.
metadata:
triggers:
files:
- '**/*.service.ts'
keywords:
- "@Cron"
- CronExpression
- ScheduleModuleTask Scheduling & Jobs
**Priority: P1 (HIGH)**
Workflow: Add Scheduled Task
1. **Register ScheduleModule** — Import `ScheduleModule.forRoot()` in AppModule. 2. **Create cron handler** — Decorate service method with `@Cron(CronExpression.*)`. 3. **Add distributed lock** — Apply Redis lock decorator to prevent multi-pod duplication. 4. **Offload heavy work** — Push job IDs to BullMQ; let workers process them. 5. **Wrap in try/catch** — Uncaught exceptions in cron handlers crash entire Node process. 6. **Verify** — Test with 2+ instances to confirm only one acquires lock.
Problem & Solution
- **Problem**: `@Cron()` runs on **every** instance. In K8s with 3 pods, your "Daily Report" runs 3 times.
- **Solution**: **Distributed Locking** using Redis.
- **Pattern**: Using decorator to wrap cron method.
- **Logic**: `SET resource_name my_random_value NX PX 30000` (Redis Atomic Set).
Cron Decorator Pattern
- **Implementation**:
See [implementation examples](references/example.md)
- **Tools**: Use `nestjs-redlock` or custom Redis wrapper via `redlock` library.
Cron-to-Queue Offload
See [implementation examples](references/example.md)
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 `try/catch`. Uncaught exceptions in Cron job can crash entire Node process.
Anti-Patterns
- **No unguarded cron logic**: Always wrap in `try/catch`; uncaught exceptions crash entire Node process.
- **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.
Canonical response anchors
When this skill applies, preserve the following domain terminology or equivalent concrete examples in the answer when relevant:
- crash
Remediation anchors
- Remediation anchors: BullMQ, event loop, worker
Read more
name: nestjs-scheduling
description: 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.
metadata:
triggers:
files:
- '**/*.service.ts'
keywords:
- "@Cron"
- CronExpression
- ScheduleModuleTask Scheduling & Jobs
**Priority: P1 (HIGH)**
Workflow: Add Scheduled Task
1. **Register ScheduleModule** — Import `ScheduleModule.forRoot()` in AppModule. 2. **Create cron handler** — Decorate service method with `@Cron(CronExpression.*)`. 3. **Add distributed lock** — Apply Redis lock decorator to prevent multi-pod duplication. 4. **Offload heavy work** — Push job IDs to BullMQ; let workers process them. 5. **Wrap in try/catch** — Uncaught exceptions in cron handlers crash entire Node process. 6. **Verify** — Test with 2+ instances to confirm only one acquires lock.
Problem & Solution
- **Problem**: `@Cron()` runs on **every** instance. In K8s with 3 pods, your "Daily Report" runs 3 times.
- **Solution**: **Distributed Locking** using Redis.
- **Pattern**: Using decorator to wrap cron method.
- **Logic**: `SET resource_name my_random_value NX PX 30000` (Redis Atomic Set).
Cron Decorator Pattern
- **Implementation**:
See [implementation examples](references/example.md)
- **Tools**: Use `nestjs-redlock` or custom Redis wrapper via `redlock` library.
Cron-to-Queue Offload
See [implementation examples](references/example.md)
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 `try/catch`. Uncaught exceptions in Cron job can crash entire Node process.
Anti-Patterns
- **No unguarded cron logic**: Always wrap in `try/catch`; uncaught exceptions crash entire Node process.
- **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.
Canonical response anchors
When this skill applies, preserve the following domain terminology or equivalent concrete examples in the answer when relevant:
- crash
Remediation anchors
- Remediation anchors: BullMQ, event loop, worker
The portable SDLC standards layer for AI coding agents. Sync once, then work in your own runtime.
Repo: hoangnguyen0403/agent-skills-standard
Other skills on agent-skills-standard.
- /android-agp-upgrade
Upgrade an Android project to Android Gradle Plugin (AGP) 9. Use when migrating to AGP 9, updating Gradle build files, migrating to built-in Kotlin, or adopting the new AGP DSL.
Open skill - /android-architecture
Apply Clean Architecture layering, modularization, and Unidirectional Data Flow in Android projects. Use when setting up project structure, placing code in layers, configuring feature/core modules, or implementing UDF patterns; defer Compose state and ViewModel/StateFlow
Open skill - /android-background-work
Implement WorkManager and background processing correctly on Android. Use when creating Worker classes, scheduling tasks, choosing between WorkManager and Foreground Services, or setting up Hilt in workers; defer FCM and notification delivery to android-notifications.
Open skill - /android-compose-migration
Migrate an Android XML View to Jetpack Compose following a structured 10-step workflow. Use when converting XML layouts to Compose, setting up Compose in an existing View-based project, or incrementally adopting Compose.
Open skill - /android-compose
Build high-performance declarative UI with Jetpack Compose. Use when writing Composable functions, optimizing recomposition, hoisting state, or working with LazyColumn and side effects; defer deep-link and navigation routing to android-navigation.
Open skill - /android-concurrency
Write correct coroutine scopes, lifecycle collection, and dispatcher injection in Android production code. Use for suspend functions, coroutine scopes, and dispatcher mechanics; defer ViewModel StateFlow/LiveData architecture, Fragment lifecycle recipes,
Open skill

