Bee Queue
🐝 Introdução ao Bee Queue
Ferramenta para perfomatizar filas de tarefas com NodeJS
1. Instalação
$ yarn add bee-queue
2. Configurações
Arquivo src/lib/Queue.js
import Bee from 'bee-queue';import CancellationMail from '../app/jobs/CancellationMail';import redisConfig from '../config/redis';const jobs = [CancellationMail];class Queue {constructor() {this.queues = {};this.init();}init() {jobs.forEach(({ key, handle }) => {this.queues[key] = {bee: new Bee(key, {redis: redisConfig,}),handle,};});}add(queue, job) {return this.queues[queue].bee.createJob(job).save();}processQueue() {jobs.forEach(job => {const { bee, handle } = this.queues[job.key];bee.process(handle);});}}export default new Queue();
3. Arquivo de filas
Arquivo src/app/jobs/CancellationMail.js (exemplo)
import { format } from 'date-fns';import pt from 'date-fns/locale/pt';import Mail from '../../lib/Mail';class CancellationMail {get key() {return 'CancellationMail';}async handle({ data }) {const { appointment } = data;await Mail.sendMail({to: `${appointment.provider.name} <${appointment.provider.email}>`, // Conteúdosubject: 'Agendamento cancelado', // transferidotemplate: 'cancellation', // do controllercontext: { // AppointmentController.jsprovider: appointment.provider.name, //user: appointment.user.name, // Aqui será tratadodate: format(appointment.date, "'dia' dd 'de' MMMM', às' H:mm'h'", { // a fila para envio delocale: pt, // e-mail referente a}), // um cancelamento.},});}}export default new CancellationMail();
4. Mudanças no Controller
Arquivo src/app/controllers/AppointmentControllers.js
// Importação dos arquivos referentes à filaimport CancellationMail from '../jobs/CancellationMail';import Queue from '../../lib/Queue';// [...] Dentro do método necessário...// Adicionar o métood à filaawait Queue.add(CancellationMail.key, {appointment,});
5. Arquivos para processamento da fila em outro Node
Arquivo ./src/queue.js
import Queue from './lib/Queue';Queue.processQueue();
Arquivo package.json
"scripts": {"queue": "nodemon src/queue.js",}
6. Prevenção contra erros
Arquivo src/lib/Queue.js
Alterações no processamento com o método .on('failed', this.handleFailure)
bee.on('failed', this.handleFailure).process(handle);
Criação do método handleFailure
handleFailure(job, err) {console.log(`Queue ${job.queue.name}: FAILED`, err);}