Repository navigation
Expand file tree
/
Copy pathqueue.js
More file actions
64 lines (48 loc) · 1.96 KB
/
Copy pathqueue.js
File metadata and controls
64 lines (48 loc) · 1.96 KB
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
const request = require('request-promise');
const express = require('express');
const app = express();
const PORT = 8081;
const consumeURL = `http://localhost:8082/consumer/consume`;
const isBusyURL = `http://localhost:8082/consumer/isBusy`;
let msgID = 0;
let messagesToBeConsumed = [];
let consumedMessages = [];
// while there is messages in the queue, try to call "consumer/consume"
setInterval(async () => {
if (messagesToBeConsumed.length === 0) {
return;
}
let isConsumerBusy = JSON.parse(await request.get(isBusyURL)).isBusy;
if (isConsumerBusy) {
return;
}
//consumer available to consume new messages
let message = messagesToBeConsumed.reverse().pop(); // reverse to get FIFO order
//call consume
let result = JSON.parse(await request.get(`${consumeURL}?id=${message.id}&message=${message.content}`));
if (!result.success) {
messagesToBeConsumed.push(message);
console.log(`consumer/consume failure: ${result.error}, Message ${message.id} didn't consumed.`);
return;
}
consumedMessages.push(message);
console.log(`consumer/consume success: Message ${message.id} consumed.`);
}, 1000);
// producer should call this endpoint when it wants to add some message to be consumed
app.get('/queue/add', async (req, res) => {
let message = {id: msgID, content: req.query.message};
messagesToBeConsumed.push(message);
console.log(`queue/add: ${message.id}`);
msgID++;
res.send(`message with id = ${message.id} added to queue`);
});
// consumer should call this endpoint when after it processes the message
app.get('/queue/remove', async (req, res) => {
let id = req.query.id;
consumedMessages = consumedMessages.filter(message => message.id !== id);
console.log(`queue/remove: ${id}`);
res.send(`message with id = ${id} removed from queue`);
});
let server = app.listen(PORT, function () {
console.log(`Example app listening at http://localhost:${PORT}`)
});