-
Notifications
You must be signed in to change notification settings - Fork 0
/
rpc_server.js
executable file
·75 lines (72 loc) · 1.97 KB
/
rpc_server.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/usr/bin/env node
var amqp = require('amqplib/callback_api');
var config = require('./config.dev')
var currentLevel = 0
var bluebird = require('bluebird')
var Redis = require('ioredis');
var redis = new Redis();
function initRedis(){
redis.set('rpccount', 0 )
}
function decRediscount(){
redis.decr('rpccount')
}
function incRediscount(){
redis.incr('rpccount')
}
async function setupServer(queue, handler){
initRedis()
amqp.connect(config.RABBITMQ_URL, function(err, conn) {
if(err){
console.log("err", err);
return
}
conn.createChannel(function(err, ch) {
ch.assertQueue(queue, {durable: false});
ch.prefetch(3);
console.log(' [x] Awaiting RPC requests');
ch.consume(queue, function(req) {
incRediscount()
// console.log("count",count)
handler(req)
.then(fResult =>{
console.log("handle complete, send result to client", fResult);
ch.sendToQueue(req.properties.replyTo,new Buffer( JSON.stringify( fResult) ), {correlationId: req.properties.correlationId});//sync send the result back to client
// ch.ack(req);
var rdn = parseInt(Math.random()*1000*5);
console.log('delay finish in %d ms' , rdn);
bluebird.delay(rdn).then(function(){
decRediscount()
ch.ack(req);
console.log('finish ack');
ch.get(queue);
ch.cancel();
});
});
});
});
});
}
//do work
async function worker(req){
var msg = req.content.toString();
console.log("receive:", msg);
var userLevel = {}
console.log('simulate working in 2s ...')
await bluebird.delay(2000)
try{
userLevel = JSON.parse(msg)
currentLevel += 1
userLevel.level = currentLevel
}
catch(e)
{
console.error('pass error')
return -1;
}
console.log(" [.] user current Level ", currentLevel);
return userLevel
}
var q = 'rpc_queue'
setupServer(q, worker)
console.log('rpc server started ...')