bun + hono
This commit is contained in:
61
src/queues/email.queue.ts
Normal file
61
src/queues/email.queue.ts
Normal file
@@ -0,0 +1,61 @@
|
||||
import { Queue, Worker, QueueEvents } from 'bullmq'
|
||||
import { EmailService } from '../services/email'
|
||||
import { config } from '../config/env'
|
||||
import Redis from 'ioredis'
|
||||
|
||||
interface EmailJob {
|
||||
to: string
|
||||
subject: string
|
||||
html: string
|
||||
text: string
|
||||
}
|
||||
|
||||
const connection = new Redis(config.redis.url, {
|
||||
maxRetriesPerRequest: null
|
||||
})
|
||||
|
||||
export const emailQueue = new Queue<EmailJob>('email', {
|
||||
connection,
|
||||
defaultJobOptions: {
|
||||
attempts: 3,
|
||||
backoff: {
|
||||
type: 'exponential',
|
||||
delay: 1000
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
const worker = new Worker<EmailJob>(
|
||||
'email',
|
||||
async (job) => {
|
||||
const emailService = new EmailService()
|
||||
await emailService.sendEmail(job.data)
|
||||
},
|
||||
{
|
||||
connection,
|
||||
concurrency: 5,
|
||||
limiter: {
|
||||
max: 100,
|
||||
duration: 1000 * 60 // 100 emails per minute
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
const queueEvents = new QueueEvents('email', { connection })
|
||||
|
||||
worker.on('completed', (job) => {
|
||||
console.log(`Email job ${job.id} completed`)
|
||||
})
|
||||
|
||||
worker.on('failed', (job, error) => {
|
||||
console.error(`Email job ${job?.id} failed:`, error)
|
||||
})
|
||||
|
||||
queueEvents.on('waiting', ({ jobId }) => {
|
||||
console.log(`Job ${jobId} is waiting`)
|
||||
})
|
||||
|
||||
process.on('SIGTERM', async () => {
|
||||
await worker.close()
|
||||
await connection.quit()
|
||||
})
|
||||
Reference in New Issue
Block a user