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;
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);
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.');
});
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)
boa!
Monstro demais