mailer/src/queues/email.queue.ts
2024-11-20 14:45:39 +01:00

61 lines
1.2 KiB
TypeScript

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()
})