forked from booksbyus/zguide
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Signed-off-by: Octavian Ionescu <itavyg@gmail.com>
- Loading branch information
Showing
5 changed files
with
302 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
'use strict'; | ||
var requester, | ||
zmq = require('zmq'); | ||
|
||
requester = zmq.socket('req'); | ||
requester.connect('tcp://127.0.0.1:5555'); | ||
// requester.connect('ipc://../clients.ipc'); | ||
|
||
requester.on('message', function (msg) { | ||
console.log(new Date(), 'received: ', msg.toString()); | ||
requester.close(); | ||
}); | ||
|
||
requester.send('Hello'); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
/* | ||
* @fileoverview Simple message queuing broker | ||
* Same as request-reply broker but using QUEUE device | ||
* @author Octavian Ionescu <itavyg(at)gmail(dot)com> | ||
*/ | ||
'use strict'; | ||
var frontend, backend, | ||
zmq = require('zmq'); | ||
|
||
frontend = zmq.socket('router'); | ||
frontend.bind('tcp://localhost:5559'); | ||
backend = zmq.socket('dealer'); | ||
backend.bind('tcp://localhost:5560'); | ||
|
||
zmq.proxy(frontend, backend); | ||
|
||
process.on('SIGINT', function () { | ||
frontend.close(); | ||
backend.close(); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
/* | ||
* @fileoverview Multithreaded Hello World server. it uses | ||
* cluster module since nodejs is singlethreaded | ||
* @author Octavian Ionescu <itavyg(at)gmail(dot)com> | ||
*/ | ||
'use strict'; | ||
var c, cleanExit, k, sender, receiver, | ||
startedWorkers = 0, | ||
zmq = require('zmq'), | ||
cluster = require('cluster'); | ||
|
||
cleanExit = function () { | ||
if (0 === startedWorkers) { | ||
// no more workers | ||
receiver.close(); | ||
} | ||
}; | ||
|
||
if (cluster.isMaster) { | ||
receiver = zmq.socket('pair'); | ||
receiver.bind('ipc://step3.ipc'); | ||
receiver.on('message', function (/*msg*/) { | ||
console.log('Test successfull!'); | ||
}); | ||
|
||
cluster.on('fork', function (worker) { | ||
// send message to child to know which step to simulate | ||
// 1 it is in the middle | ||
// 2 it is at the end and must send message | ||
worker.send(++startedWorkers); | ||
}); | ||
|
||
cluster.on('exit', function (/*worker, code, signal*/) { | ||
startedWorkers -= 1; | ||
cleanExit(); | ||
}); | ||
|
||
for (k = 0; 2 > k; k += 1) { | ||
cluster.fork(); | ||
} | ||
} else { | ||
process.on('message', function (processMsg) { | ||
if (1 === processMsg) { | ||
receiver = zmq.socket('pair'); | ||
receiver.bind('ipc://step2.ipc'); | ||
sender = zmq.socket('pair'); | ||
sender.connect('ipc://step3.ipc'); | ||
receiver.on('message', function (msg) { | ||
sender.send(msg); | ||
}); | ||
} else { | ||
sender = zmq.socket('pair'); | ||
sender.connect('ipc://step2.ipc'); | ||
sender.send(''); | ||
} | ||
}); | ||
} | ||
|
||
process.on('SIGINT', function () { | ||
if (cluster.isMaster) { | ||
for (c in cluster.workers) { | ||
if ({}.hasOwnProperty.call(cluster.workers, c)) { | ||
cluster.workers[c].kill('SIGINT'); | ||
} | ||
} | ||
cleanExit(); | ||
} else { | ||
if (receiver) { | ||
receiver.close(); | ||
} | ||
if (sender) { | ||
sender.close(); | ||
} | ||
} | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
/* | ||
* @fileoverview Multithreaded Hello World server. it uses | ||
* cluster module since nodejs is singlethreaded | ||
* @author Octavian Ionescu <itavyg(at)gmail(dot)com> | ||
*/ | ||
'use strict'; | ||
var clients, workers, k, setupProxy, receiver, | ||
c, cleanExit, | ||
startedWorkers = 0, | ||
zmq = require('zmq'), | ||
cluster = require('cluster'); | ||
|
||
|
||
cleanExit = function () { | ||
if (0 === startedWorkers) { | ||
// no more workers | ||
workers.close(); | ||
} | ||
}; | ||
|
||
setupProxy = function () { | ||
clients = zmq.socket('router'); | ||
clients.bind('tcp://127.0.0.1:5555'); | ||
|
||
workers = zmq.socket('dealer'); | ||
workers.bind('ipc://workers.ipc'); | ||
|
||
zmq.proxy(clients, workers); | ||
}; | ||
|
||
if (cluster.isMaster) { | ||
// start forking after we setup the proxy | ||
(function () { | ||
|
||
for (k = 0; 5 > k; k += 1) { | ||
cluster.fork(); | ||
} | ||
|
||
cluster.on('fork', function (/*worker*/) { | ||
startedWorkers += 1; | ||
}); | ||
|
||
cluster.on('exit', function (/*worker, code, signal*/) { | ||
startedWorkers -= 1; | ||
cleanExit(); | ||
}); | ||
|
||
}(setupProxy())); | ||
} else { | ||
|
||
receiver = zmq.socket('rep'); | ||
receiver.connect('ipc://workers.ipc'); | ||
|
||
receiver.on('message', function (msg) { | ||
console.log('Received request: ', msg.toString()); | ||
// simulate some work and send reply after 1s | ||
|
||
setTimeout(function () { | ||
receiver.send('World'); | ||
}, 1000); | ||
|
||
}); | ||
|
||
} | ||
|
||
process.on('SIGINT', function () { | ||
if (cluster.isMaster) { | ||
// stop accepting new requests | ||
clients.close(); | ||
for (c in cluster.workers) { | ||
if ({}.hasOwnProperty.call(cluster.workers, c)) { | ||
cluster.workers[c].kill('SIGINT'); | ||
} | ||
} | ||
cleanExit(); | ||
} else { | ||
receiver.close(); | ||
} | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,114 @@ | ||
{ | ||
"name": "zmq-node-examples", | ||
"description": "Examples for zmq guide", | ||
"version": "0.0.1", | ||
"contributors": [ | ||
"Octavian Ionescu <itavyg@gmail.com> (https://github.com/itavy)" | ||
], | ||
"dependencies": { | ||
"zmq": "2.10.0" | ||
}, | ||
"jshintConfig": { | ||
"curly": false, | ||
"eqeqeq": true, | ||
"immed": true, | ||
"newcap": true, | ||
"noarg": true, | ||
"sub": true, | ||
"undef": true, | ||
"unused": true, | ||
"boss": true, | ||
"eqnull": true, | ||
"node": true, | ||
"strict": true, | ||
"white": true, | ||
"nonbsp": true, | ||
"browser": true, | ||
"mocha": true, | ||
"indent": 2, | ||
"latedef": true, | ||
"immed": true, | ||
"shadow": false | ||
}, | ||
"jscsConfig": { | ||
"disallowTrailingWhitespace": true, | ||
"validateIndentation": 2, | ||
"validateParameterSeparator": ", ", | ||
"validateQuoteMarks": { | ||
"mark": "'", | ||
"escape": true | ||
}, | ||
"disallowEmptyBlocks": true, | ||
"disallowMixedSpacesAndTabs": true, | ||
"disallowMultipleLineStrings": true, | ||
"disallowSpaceAfterObjectKeys": true, | ||
"disallowSpaceAfterPrefixUnaryOperators": true, | ||
"disallowSpaceBeforePostfixUnaryOperators": true, | ||
"disallowSpacesInCallExpression": true, | ||
"disallowTrailingComma": true, | ||
"requireDotNotation": "except_snake_case", | ||
"requireLineBreakAfterVariableAssignment": true, | ||
"requireMultipleVarDecl": "onevar", | ||
"requireSpaceAfterBinaryOperators": true, | ||
"requireSpaceAfterKeywords": true, | ||
"requireSpaceBeforeBinaryOperators": true, | ||
"requireSpaceBeforeBlockStatements": true, | ||
"requireSpaceBetweenArguments": true, | ||
"requireSpacesInNamedFunctionExpression": { | ||
"beforeOpeningRoundBrace": true, | ||
"beforeOpeningCurlyBrace": true | ||
}, | ||
"requireSpacesInFunctionExpression": { | ||
"beforeOpeningRoundBrace": true, | ||
"beforeOpeningCurlyBrace": true | ||
}, | ||
"requireSpacesInAnonymousFunctionExpression": { | ||
"beforeOpeningRoundBrace": true, | ||
"beforeOpeningCurlyBrace": true | ||
}, | ||
"requireSpacesInFunctionDeclaration": { | ||
"beforeOpeningRoundBrace": true, | ||
"beforeOpeningCurlyBrace": true | ||
}, | ||
"requireBlocksOnNewline": true, | ||
"requireCurlyBraces": [ | ||
"if", | ||
"else", | ||
"for", | ||
"while", | ||
"do", | ||
"try", | ||
"catch" | ||
] | ||
}, | ||
"eslintConfig": { | ||
"env": { | ||
"node": true, | ||
"mocha": true | ||
}, | ||
"rules": { | ||
"quotes": [1, "single"], | ||
"no-mixed-requires": [0, false], | ||
"no-underscore-dangle": [0, false], | ||
"yoda": [1, "always"], | ||
"indent": [2, 2], | ||
"brace-style": [2, "1tbs"], | ||
"comma-style": [2, "last"], | ||
"default-case": 2, | ||
"func-style": [2, "declaration"], | ||
"guard-for-in": 2, | ||
"no-floating-decimal": 2, | ||
"no-nested-ternary": 2, | ||
"no-undefined": 2, | ||
"radix": 2, | ||
"space-after-function-name": [1, "always"], | ||
"space-after-keywords": [2, "always"], | ||
"space-before-blocks": 2, | ||
"spaced-line-comment": [2, "always", { "exceptions": ["-"]}], | ||
"strict": [2, "global"], | ||
"wrap-iife": 2, | ||
"camelcase": false, | ||
"new-cap": false | ||
} | ||
} | ||
} |