@dirupt/adonis-resque
v3.0.0
Published
Resque Queue for AdonisJS (fork with AdonisJS v7 support)
Maintainers
Readme
@dirupt/adonis-resque
Fork of adonis-resque with AdonisJS v7 support
Resque queue system for AdonisJS, powered by node-resque.
Credits
This package is a fork of adonis-resque by Dai Jie, updated for AdonisJS v7 compatibility. All credit for the original implementation goes to the original author.
Versions
| @dirupt/adonis-resque | @adonisjs/core | @adonisjs/redis | |-----------------------|----------------|-----------------| | ^3.*.* | ^7.*.* | ^9.*.* |
For AdonisJS v6, use the original package: adonis-resque@^2
Installation
pnpm add @dirupt/adonis-resqueAfter install call configure:
node ace configure @dirupt/adonis-resqueThis will:
- Create
config/resque.tswith default configuration - Register the provider and commands in
adonisrc.ts
Usage
Make sure @adonisjs/redis is installed and configured before using this package.
Creating a Job
node ace make:job send_emailThis creates app/jobs/send_email.ts:
import { BaseJob } from '@dirupt/adonis-resque'
export default class SendEmail extends BaseJob {
async perform(email: string, subject: string) {
// Your job logic here
}
}Enqueueing Jobs
import SendEmail from '#jobs/send_email'
// Enqueue immediately
await SendEmail.enqueue('[email protected]', 'Welcome!')
// Enqueue with delay (in ms)
await SendEmail.enqueueIn(5000, '[email protected]', 'Reminder')
// Enqueue at specific time (unix timestamp in ms)
await SendEmail.enqueueAt(Date.now() + 60000, '[email protected]', 'Scheduled')
// Batch enqueue
await SendEmail.enqueueAll([
['[email protected]', 'Hello'],
['[email protected]', 'Hello'],
])Scheduling Jobs (Cron / Interval)
import { BaseJob } from '@dirupt/adonis-resque'
export default class CleanupJob extends BaseJob {
// Run every hour
cron = '0 * * * *'
// Or use interval (e.g., every 5 minutes)
// interval = '5m'
async perform() {
// Cleanup logic
}
}Plugins
import { BaseJob, Plugin } from '@dirupt/adonis-resque'
export default class UniqueJob extends BaseJob {
plugins = [
Plugin.jobLock({ lockTimeout: 3600 }),
Plugin.retry({ retryLimit: 3, retryDelay: 1000 }),
]
async perform() {
// Job logic
}
}Available plugins:
Plugin.jobLock()- Prevent duplicate running jobsPlugin.queueLock()- Prevent duplicate queued jobsPlugin.delayQueueLock()- Prevent duplicate delayed jobsPlugin.retry()- Retry failed jobsPlugin.noop()- Log errors without throwing
Starting Workers
# Start workers (default)
node ace resque:start
# Start scheduler only
node ace resque:start --schedule
# Use multi-worker
node ace resque:start --isMulti
# Specify queue names
node ace resque:start --queueName=high --queueName=defaultConfiguration
In config/resque.ts:
import { defineConfig } from '@dirupt/adonis-resque'
const resqueConfig = defineConfig({
redisConnection: 'main',
runWorkerInWebEnv: true,
runScheduler: true,
isMultiWorkerEnabled: true,
multiWorkerOption: {
minTaskProcessors: 1,
maxTaskProcessors: 10,
},
workerOption: {},
queueNameForJobs: 'default',
queueNameForWorkers: '*',
logger: null,
verbose: true,
})
export default resqueConfigError Handling
Override handleError in your job class:
export default class MyJob extends BaseJob {
handleError(error: unknown) {
// Custom error handling
console.error('Job failed:', error)
throw error // Re-throw to mark as failed
}
onFailure(failure: ResqueFailure) {
// Called when the job fails after all retries
}
}