DEV Community

Gabriel de Paula Queiroz
Gabriel de Paula Queiroz

Posted on

Socket.io + Bull 📨

Introdução

Recentemente tive uma certa dificuldade na implementação de um socket em uma queue.
Precisava que ao completar o processo da queue, o servidor se comunicasse com o client, e como sou um desenvolvedor que está começando a mexer com node.js, consegui solucionar o problema com as ferramentas que tenho ao meu alcançe.

Modificando o Socket.io 🔧

O primeiro passo foi adaptar o socket. Segui a orientação de um amigo, onde ele mostra como faz o desacoplamento.

How to uncouples emit events from connection event into socket.io

Mas como nem tudo cai do céu, precisei fazer algumas alterações...

const socketio = require('socket.io');

let instance = null;

class SocketService {
    static Initialize(server) {
        instance = socketio(server);
        instance.on('connection', socket => {
            console.log('connected');
        });

        return instance;
    }

    static getInstance() {
        return instance;
    }
}

module.exports = SocketService;
Enter fullscreen mode Exit fullscreen mode

Alterando o app.js 🔁

No app.js inicializei o SocketService, e com isso consegui ter uma instância da biblioteca para usar em qualquer lugar do sistema.

const express = require('express');
const http = require('http');
const SocketService = require('./services/SocketService');

const app = express();
const server = http.Server(app);

app.set('socketService', SocketService.Initialize(this.server));

app.use(express.json());

server.listen(3333);
Enter fullscreen mode Exit fullscreen mode

E como vou aplicar isso na fila? 🦏

É bem simples, basta pegar a instância que foi criada no app.js!

Caso queira saber mais sobre o bull, clique aqui

const alertQueue = new Queue(AlertQueue.key, redisConfig);
const socket = Socket.getInstance();

alertQueue.on('completed', job => {
    socket.emit('message', 'Mensagem que será entregue ao client.');
});

Enter fullscreen mode Exit fullscreen mode

Conclusão 🙌🏽

Espero que possa ter ajudado de alguma maneira e fique a vontade para entrar em contato caso tenha alguma duvida!

Top comments (2)

Collapse
 
paulocastellano profile image
Paulo Castellano

boa!

Collapse
 
wakeupmh profile image
Marcos Henrique

Monstro demais