diff --git a/bondarenko_max_lab_4/.gitignore b/bondarenko_max_lab_4/.gitignore new file mode 100644 index 0000000..b512c09 --- /dev/null +++ b/bondarenko_max_lab_4/.gitignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/bondarenko_max_lab_4/consumer1.js b/bondarenko_max_lab_4/consumer1.js new file mode 100644 index 0000000..f8deb95 --- /dev/null +++ b/bondarenko_max_lab_4/consumer1.js @@ -0,0 +1,40 @@ +const amqp = require('amqplib/callback_api'); + +const EXCHANGE_NAME = 'logs'; +const QUEUE_NAME = 'queue1'; + +amqp.connect('amqp://localhost', (err, connection) => { + if (err) { + throw err; + } + + connection.createChannel((err, channel) => { + if (err) { + throw err; + } + + channel.assertExchange(EXCHANGE_NAME, 'fanout', { + durable: false, + }); + + channel.assertQueue(QUEUE_NAME, { + exclusive: false, + }, (err, q) => { + + if (err) { + throw err; + } + + channel.bindQueue(q.queue, EXCHANGE_NAME, ''); + + channel.consume(q.queue, (msg) => { + console.log(` [x] Received '${msg.content.toString()}'`); + setTimeout(() => { + console.log(` [x] Done processing '${msg.content.toString()}'`); + }, 2000); + }, { + noAck: true, + }); + }); + }); +}); diff --git a/bondarenko_max_lab_4/consumer2.js b/bondarenko_max_lab_4/consumer2.js new file mode 100644 index 0000000..fcb478d --- /dev/null +++ b/bondarenko_max_lab_4/consumer2.js @@ -0,0 +1,36 @@ +const amqp = require('amqplib/callback_api'); + +const EXCHANGE_NAME = 'logs'; +const QUEUE_NAME = 'queue2'; + +amqp.connect('amqp://localhost', (err, connection) => { + if (err) { + throw err; + } + + connection.createChannel((err, channel) => { + if (err) { + throw err; + } + + channel.assertExchange(EXCHANGE_NAME, 'fanout', { + durable: false, + }); + + channel.assertQueue(QUEUE_NAME, { + exclusive: false, + }, (err, q) => { + if (err) { + throw err; + } + + channel.bindQueue(q.queue, EXCHANGE_NAME, ''); + + channel.consume(q.queue, (msg) => { + console.log(` [x] Received '${msg.content.toString()}'`); + }, { + noAck: true, + }); + }); + }); +}); diff --git a/bondarenko_max_lab_4/package-lock.json b/bondarenko_max_lab_4/package-lock.json new file mode 100644 index 0000000..3cf4792 --- /dev/null +++ b/bondarenko_max_lab_4/package-lock.json @@ -0,0 +1,97 @@ +{ + "name": "bondarenko_max_lab_4", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "amqplib": "^0.10.5" + } + }, + "node_modules/@acuminous/bitsyntax": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@acuminous/bitsyntax/-/bitsyntax-0.1.2.tgz", + "integrity": "sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==", + "license": "MIT", + "dependencies": { + "buffer-more-ints": "~1.0.0", + "debug": "^4.3.4", + "safe-buffer": "~5.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/amqplib": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.10.5.tgz", + "integrity": "sha512-Dx5zmy0Ur+Q7LPPdhz+jx5IzmJBoHd15tOeAfQ8SuvEtyPJ20hBemhOBA4b1WeORCRa0ENM/kHCzmem1w/zHvQ==", + "license": "MIT", + "dependencies": { + "@acuminous/bitsyntax": "^0.1.2", + "buffer-more-ints": "~1.0.0", + "url-parse": "~1.5.10" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/buffer-more-ints": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz", + "integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "license": "MIT" + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + } + } +} diff --git a/bondarenko_max_lab_4/package.json b/bondarenko_max_lab_4/package.json new file mode 100644 index 0000000..afd40dc --- /dev/null +++ b/bondarenko_max_lab_4/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "amqplib": "^0.10.5" + } +} diff --git a/bondarenko_max_lab_4/publisher.js b/bondarenko_max_lab_4/publisher.js new file mode 100644 index 0000000..2e12592 --- /dev/null +++ b/bondarenko_max_lab_4/publisher.js @@ -0,0 +1,26 @@ +const amqp = require('amqplib/callback_api'); + +const EXCHANGE_NAME = 'logs'; +const EVENT_INTERVAL = 1000; + +amqp.connect('amqp://localhost', (err, connection) => { + if (err) { + throw err; + } + + connection.createChannel((err, channel) => { + if (err) { + throw err; + } + + channel.assertExchange(EXCHANGE_NAME, 'fanout', { + durable: false, + }); + + setInterval(() => { + const msg = `Event at ${new Date().toISOString()}`; + channel.publish(EXCHANGE_NAME, '', Buffer.from(msg)); + console.log(` [x] Sent '${msg}'`); + }, EVENT_INTERVAL); + }); +});