2019-06-10
최근에 Message Queue를 이용하여 받아온 결과를 실시간으로 웹에 뿌려줘야 할 일이 있었다.
그때 사용한 예제를 여기에 남겨 놓는다.

testSocketMq.js 소스
'use strict'

const amqplib = require('amqplib');
const config = require('config')
const socketio = require('socket.io')
const moment = require('moment')

let h_hostname = config.lsport.h_hostname
let h_user_name = config.lsport.h_user_name
let h_password = config.lsport.h_password
let h_queue = config.lsport.h_package_id

const open = amqplib.connect({
	protocol: 'amqp',
	hostname: h_hostname,
	port: 5600,
	username: h_user_name,
	password: h_password,
	heartbeat: 580,
	vhost: 'vhost_a',
})

let io = socketio.listen(6031);
console.log("socketio open port: "+6031)

io.sockets.on('connection', function (socket) {
	console.log('server running at '+6031+' port');
});

open.then(function(conn) {
	return conn.createChannel();
}).then(function(ch) {
		return ch.consume(h_queue, function(msg) {
			// console.log(msg)
			io.emit('new_msg', msg) //받아온 msg를 방출하는 부분
			console.log('----msg emit: '+moment().format('YYYY-MM-DD HH:mm:ss'))
		});
}).catch(console.warn);

웹 페이지 소스
<script src="http://localhost:6031/socket.io/socket.io.js"></script>

<script>
var socket = io.connect('http://localhost:6031');

socket.on('new_msg', function (data) {
    console.log(data);
});
</script>

testSocketMq.js 실행시 화면
$ node testSocketMq
socketio open port: 6031
server running at 6031 port
----msg emit: 2019-06-10 14:29:08
----msg emit: 2019-06-10 14:29:09
----msg emit: 2019-06-10 14:29:12
----msg emit: 2019-06-10 14:29:13
----msg emit: 2019-06-10 14:29:22
----msg emit: 2019-06-10 14:29:24
----msg emit: 2019-06-10 14:29:24
----msg emit: 2019-06-10 14:29:24
----msg emit: 2019-06-10 14:29:24
socket.io가 너무 막강해서, 간단히 소켓통신을 할 수 있고, 이미 메세지를 뿌려주는 MQ가 있을 때문에, 그냥 해당 메세지를 연결해서 뿌려만 주면 되는 상황이다.