keuss 1.6.15 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Queue.js +26 -0
- package/backends/ps-mongo.js +20 -5
- package/backends/stream-mongo.js +476 -0
- package/examples/snippets/07-stream-simple.js +53 -0
- package/package.json +1 -1
- package/stats/mem.js +5 -8
- package/stats/redis.js +16 -2
- package/test/backends_deadletter.js +5 -4
- package/test/backends_payload.js +2 -1
- package/test/backends_reserve-commit-rollback.js +16 -15
- package/test/pause.js +5 -5
- package/test/signal.js +35 -0
- package/test/stats.js +44 -3
- package/test/stream-mongo.js +166 -0
- package/backends/bucket-mongo.js +0 -366
- package/test/backends_bucket-at-most-once.js +0 -151
|
@@ -80,6 +80,7 @@ function release_mq_factory (q, factory, cb) {
|
|
|
80
80
|
{label: 'Simple MongoDB', mq: require ('../backends/mongo')},
|
|
81
81
|
{label: 'Pipelined MongoDB', mq: require ('../backends/pl-mongo')},
|
|
82
82
|
{label: 'Tape MongoDB', mq: require ('../backends/ps-mongo')},
|
|
83
|
+
{label: 'Stream MongoDB', mq: require ('../backends/stream-mongo')},
|
|
83
84
|
{label: 'Redis OrderedQueue', mq: require ('../backends/redis-oq')},
|
|
84
85
|
{label: 'MongoDB SafeBucket', mq: require ('../backends/bucket-mongo-safe')}
|
|
85
86
|
].forEach(function (MQ_item) {
|
|
@@ -159,8 +160,8 @@ function release_mq_factory (q, factory, cb) {
|
|
|
159
160
|
cb => stats (q, cb),
|
|
160
161
|
cb => stats (factory.deadletter_queue(), cb),
|
|
161
162
|
], (err, res) => {
|
|
162
|
-
|
|
163
|
-
|
|
163
|
+
res[1].tsize.should.equal (0);
|
|
164
|
+
res[2].tsize.should.equal (0);
|
|
164
165
|
|
|
165
166
|
cb (err, q, factory);
|
|
166
167
|
});
|
|
@@ -209,8 +210,8 @@ function release_mq_factory (q, factory, cb) {
|
|
|
209
210
|
cb => stats (q, cb),
|
|
210
211
|
cb => stats (factory.deadletter_queue(), cb),
|
|
211
212
|
], (err, res) => {
|
|
212
|
-
|
|
213
|
-
|
|
213
|
+
res[1].tsize.should.equal (0);
|
|
214
|
+
res[2].tsize.should.equal (0);
|
|
214
215
|
|
|
215
216
|
cb (err, q, factory);
|
|
216
217
|
});
|
package/test/backends_payload.js
CHANGED
|
@@ -13,7 +13,7 @@ var factory = null;
|
|
|
13
13
|
{label: 'Simple MongoDB', mq: require ('../backends/mongo')},
|
|
14
14
|
{label: 'Pipelined MongoDB', mq: require ('../backends/pl-mongo')},
|
|
15
15
|
{label: 'Tape MongoDB', mq: require ('../backends/ps-mongo')},
|
|
16
|
-
{label: '
|
|
16
|
+
{label: 'Stream MongoDB', mq: require ('../backends/stream-mongo')},
|
|
17
17
|
{label: 'Safe MongoDB Buckets', mq: require ('../backends/bucket-mongo-safe')},
|
|
18
18
|
{label: 'Redis List', mq: require ('../backends/redis-list')},
|
|
19
19
|
{label: 'Redis OrderedQueue', mq: require ('../backends/redis-oq')},
|
|
@@ -264,6 +264,7 @@ var factory = null;
|
|
|
264
264
|
{label: 'Simple MongoDB', mq: require ('../backends/mongo')},
|
|
265
265
|
{label: 'Pipelined MongoDB', mq: require ('../backends/pl-mongo')},
|
|
266
266
|
{label: 'Tape MongoDB', mq: require ('../backends/ps-mongo')},
|
|
267
|
+
{label: 'Stream MongoDB', mq: require ('../backends/stream-mongo')},
|
|
267
268
|
{label: 'Safe MongoDB Buckets', mq: require ('../backends/bucket-mongo-safe')},
|
|
268
269
|
{label: 'Redis OrderedQueue', mq: require ('../backends/redis-oq')},
|
|
269
270
|
].forEach(function (MQ_item) {
|
|
@@ -13,6 +13,7 @@ var factory = null;
|
|
|
13
13
|
{label: 'Simple MongoDB', mq: require ('../backends/mongo')},
|
|
14
14
|
{label: 'Pipelined MongoDB', mq: require ('../backends/pl-mongo')},
|
|
15
15
|
{label: 'Tape MongoDB', mq: require ('../backends/ps-mongo')},
|
|
16
|
+
{label: 'Stream MongoDB', mq: require ('../backends/stream-mongo')},
|
|
16
17
|
// {label: 'Safe MongoDB Buckets', mq: require ('../backends/bucket-mongo-safe')},
|
|
17
18
|
{label: 'Redis OrderedQueue', mq: require ('../backends/redis-oq')}
|
|
18
19
|
].forEach(function (MQ_item) {
|
|
@@ -79,7 +80,7 @@ var factory = null;
|
|
|
79
80
|
})
|
|
80
81
|
},
|
|
81
82
|
cb => q.stats((err, res) => {
|
|
82
|
-
res.should.
|
|
83
|
+
res.should.match({
|
|
83
84
|
get: 0,
|
|
84
85
|
put: 2,
|
|
85
86
|
reserve: 0,
|
|
@@ -99,7 +100,7 @@ var factory = null;
|
|
|
99
100
|
cb();
|
|
100
101
|
}),
|
|
101
102
|
cb => q.stats((err, res) => {
|
|
102
|
-
res.should.
|
|
103
|
+
res.should.match({
|
|
103
104
|
get: 1,
|
|
104
105
|
put: 2,
|
|
105
106
|
reserve: 0,
|
|
@@ -118,7 +119,7 @@ var factory = null;
|
|
|
118
119
|
},
|
|
119
120
|
cb => setTimeout (cb, 1000),
|
|
120
121
|
cb => q.stats((err, res) => {
|
|
121
|
-
res.should.
|
|
122
|
+
res.should.match({
|
|
122
123
|
get: 2,
|
|
123
124
|
put: 2,
|
|
124
125
|
reserve: 0,
|
|
@@ -170,7 +171,7 @@ var factory = null;
|
|
|
170
171
|
},
|
|
171
172
|
function (cb) {
|
|
172
173
|
q.stats(function (err, res) {
|
|
173
|
-
res.should.
|
|
174
|
+
res.should.match({
|
|
174
175
|
get: 0,
|
|
175
176
|
put: 2,
|
|
176
177
|
reserve: 0,
|
|
@@ -204,7 +205,7 @@ var factory = null;
|
|
|
204
205
|
},
|
|
205
206
|
function (cb) {
|
|
206
207
|
q.stats(function (err, res) {
|
|
207
|
-
res.should.
|
|
208
|
+
res.should.match({
|
|
208
209
|
get: 1,
|
|
209
210
|
put: 2,
|
|
210
211
|
reserve: 0,
|
|
@@ -238,7 +239,7 @@ var factory = null;
|
|
|
238
239
|
},
|
|
239
240
|
function (cb) {
|
|
240
241
|
q.stats(function (err, res) {
|
|
241
|
-
res.should.
|
|
242
|
+
res.should.match({
|
|
242
243
|
get: 2,
|
|
243
244
|
put: 2,
|
|
244
245
|
reserve: 0,
|
|
@@ -293,7 +294,7 @@ var factory = null;
|
|
|
293
294
|
},
|
|
294
295
|
function (cb) {
|
|
295
296
|
q.stats(function (err, res) {
|
|
296
|
-
res.should.
|
|
297
|
+
res.should.match({
|
|
297
298
|
get: 0,
|
|
298
299
|
put: 2,
|
|
299
300
|
reserve: 0,
|
|
@@ -320,7 +321,7 @@ var factory = null;
|
|
|
320
321
|
},
|
|
321
322
|
function (cb) {
|
|
322
323
|
q.stats(function (err, res) {
|
|
323
|
-
res.should.
|
|
324
|
+
res.should.match({
|
|
324
325
|
get: 0,
|
|
325
326
|
put: 2,
|
|
326
327
|
reserve: 0,
|
|
@@ -347,7 +348,7 @@ var factory = null;
|
|
|
347
348
|
},
|
|
348
349
|
function (cb) {
|
|
349
350
|
q.stats(function (err, res) {
|
|
350
|
-
res.should.
|
|
351
|
+
res.should.match({
|
|
351
352
|
get: 0,
|
|
352
353
|
put: 2,
|
|
353
354
|
reserve: 0,
|
|
@@ -388,7 +389,7 @@ var factory = null;
|
|
|
388
389
|
},
|
|
389
390
|
function (cb) {
|
|
390
391
|
q.stats(function (err, res) {
|
|
391
|
-
res.should.
|
|
392
|
+
res.should.match({
|
|
392
393
|
get: 2,
|
|
393
394
|
put: 2,
|
|
394
395
|
reserve: 0,
|
|
@@ -469,7 +470,7 @@ var factory = null;
|
|
|
469
470
|
},
|
|
470
471
|
function (cb) {
|
|
471
472
|
q.stats(function (err, res) {
|
|
472
|
-
res.should.
|
|
473
|
+
res.should.match({
|
|
473
474
|
get: 2,
|
|
474
475
|
put: 2,
|
|
475
476
|
reserve: 0,
|
|
@@ -526,7 +527,7 @@ var factory = null;
|
|
|
526
527
|
},
|
|
527
528
|
function (cb) {
|
|
528
529
|
q.stats(function (err, res) {
|
|
529
|
-
res.should.
|
|
530
|
+
res.should.match({
|
|
530
531
|
get: 0,
|
|
531
532
|
put: 3,
|
|
532
533
|
reserve: 0,
|
|
@@ -584,7 +585,7 @@ var factory = null;
|
|
|
584
585
|
},
|
|
585
586
|
function (cb) {
|
|
586
587
|
q.stats(function (err, res) {
|
|
587
|
-
res.should.
|
|
588
|
+
res.should.match({
|
|
588
589
|
get: 3,
|
|
589
590
|
put: 3,
|
|
590
591
|
reserve: 0,
|
|
@@ -858,7 +859,7 @@ var factory = null;
|
|
|
858
859
|
},
|
|
859
860
|
cb => setTimeout (cb, 1000),
|
|
860
861
|
cb => q.stats((err, res) => {
|
|
861
|
-
res.should.
|
|
862
|
+
res.should.match({
|
|
862
863
|
get: 0,
|
|
863
864
|
put: 1,
|
|
864
865
|
reserve: 1,
|
|
@@ -996,7 +997,7 @@ var factory = null;
|
|
|
996
997
|
cb => q.ok (state.reserved_obj, cb),
|
|
997
998
|
cb => setTimeout (cb, 1000),
|
|
998
999
|
cb => q.stats((err, res) => {
|
|
999
|
-
res.should.
|
|
1000
|
+
res.should.match({
|
|
1000
1001
|
get: 0,
|
|
1001
1002
|
put: 1,
|
|
1002
1003
|
reserve: 3,
|
package/test/pause.js
CHANGED
|
@@ -11,8 +11,8 @@ var factory = null;
|
|
|
11
11
|
{label: 'redis OrderedQueue', backend: require ('../backends/redis-oq')},
|
|
12
12
|
{label: 'pipeline MongoDB', backend: require ('../backends/pl-mongo')},
|
|
13
13
|
{label: 'persistent MongoDB', backend: require ('../backends/ps-mongo')},
|
|
14
|
+
{label: 'Stream MongoDB', backend: require ('../backends/stream-mongo')},
|
|
14
15
|
{label: 'plain MongoDB', backend: require ('../backends/mongo')},
|
|
15
|
-
{label: 'MongoDB Bucket', backend: require ('../backends/bucket-mongo')},
|
|
16
16
|
{label: 'Safe MongoDB Bucket', backend: require ('../backends/bucket-mongo-safe')},
|
|
17
17
|
].forEach (backend_item => {
|
|
18
18
|
[
|
|
@@ -102,7 +102,7 @@ var factory = null;
|
|
|
102
102
|
|
|
103
103
|
], (err, res) => {
|
|
104
104
|
if (err) return done (err);
|
|
105
|
-
res[4].should.
|
|
105
|
+
res[4].should.match ({ put: 6, get: 6 });
|
|
106
106
|
res[5].should.equal (0);
|
|
107
107
|
q.nConsumers().should.equal (0);
|
|
108
108
|
|
|
@@ -131,7 +131,7 @@ var factory = null;
|
|
|
131
131
|
cb => q._stats.clear (cb),
|
|
132
132
|
], (err, res) => {
|
|
133
133
|
if (err) return done (err);
|
|
134
|
-
res[4].should.
|
|
134
|
+
res[4].should.match ({ put: 1, get: 1 });
|
|
135
135
|
res[5].should.equal (0);
|
|
136
136
|
q.nConsumers().should.equal (0);
|
|
137
137
|
|
|
@@ -165,7 +165,7 @@ var factory = null;
|
|
|
165
165
|
cb => q._stats.clear (cb)
|
|
166
166
|
], (err, res) => {
|
|
167
167
|
if (err) return done (err);
|
|
168
|
-
res[4].should.
|
|
168
|
+
res[4].should.match ({ put: 1 });
|
|
169
169
|
res[5].should.equal (1);
|
|
170
170
|
res[2][0].timeout.should.eql (true);
|
|
171
171
|
res[7].payload.should.eql ({q:0, a: 'ryetyeryre 0'});
|
|
@@ -201,7 +201,7 @@ var factory = null;
|
|
|
201
201
|
cb => q._stats.clear (cb)
|
|
202
202
|
], (err, res) => {
|
|
203
203
|
if (err) return done (err);
|
|
204
|
-
res[6].should.
|
|
204
|
+
res[6].should.match ({ put: 1 });
|
|
205
205
|
res[7].should.equal (1);
|
|
206
206
|
res[4].timeout.should.eql (true);
|
|
207
207
|
res[9].payload.should.eql ({q:0, a: 'ryetyeryre 0'});
|
package/test/signal.js
CHANGED
|
@@ -40,6 +40,41 @@ _.forEach ({
|
|
|
40
40
|
setTimeout (() => factory.close(done), 500);
|
|
41
41
|
});
|
|
42
42
|
});
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
it ('signals insertion ok', done => {
|
|
46
|
+
CL ({}, (err, factory) => {
|
|
47
|
+
if (err) return done(err);
|
|
48
|
+
const q = {
|
|
49
|
+
ns() {return 'the-ns'},
|
|
50
|
+
name () {return 'the-queue'},
|
|
51
|
+
signalInsertion (d) {
|
|
52
|
+
d.getTime().should.equal (1234567890);
|
|
53
|
+
factory.close(done);
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const signal = factory.signal (q, {});
|
|
58
|
+
setTimeout (() => signal.emitInsertion (new Date(1234567890)), 500);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it ('signals pause ok', done => {
|
|
63
|
+
CL ({}, (err, factory) => {
|
|
64
|
+
if (err) return done(err);
|
|
65
|
+
const q = {
|
|
66
|
+
ns() {return 'the-ns'},
|
|
67
|
+
name () {return 'the-queue'},
|
|
68
|
+
signalPaused(d) {
|
|
69
|
+
d.should.equal (true);
|
|
70
|
+
factory.close(done);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
const signal = factory.signal (q, {});
|
|
75
|
+
setTimeout (() => signal.emitPaused (true), 500);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
43
78
|
|
|
44
79
|
|
|
45
80
|
describe (`extra/generic pubsub`, () => {
|
package/test/stats.js
CHANGED
|
@@ -39,9 +39,14 @@ _.forEach ({
|
|
|
39
39
|
CL ((err, ftry) => {
|
|
40
40
|
if (err) return done(err);
|
|
41
41
|
var mem = ftry.stats (ns, name);
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
|
|
43
|
+
async.series([
|
|
44
|
+
cb => mem.clear (cb),
|
|
45
|
+
], () => {
|
|
46
|
+
mem.values (function (err, vals) {
|
|
47
|
+
vals.should.eql ({});
|
|
48
|
+
ftry.close(done);
|
|
49
|
+
});
|
|
45
50
|
});
|
|
46
51
|
});
|
|
47
52
|
});
|
|
@@ -52,6 +57,7 @@ _.forEach ({
|
|
|
52
57
|
var mem = ftry.stats (ns, name);
|
|
53
58
|
|
|
54
59
|
async.series([
|
|
60
|
+
cb => mem.clear (cb),
|
|
55
61
|
cb => mem.incr ('v1', 1, cb),
|
|
56
62
|
cb => mem.incr ('v2', 1, cb),
|
|
57
63
|
cb => mem.incr ('v3', 1, cb)
|
|
@@ -251,5 +257,40 @@ _.forEach ({
|
|
|
251
257
|
});
|
|
252
258
|
});
|
|
253
259
|
});
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
it ('managed hierarchy (dotted keys) ok', done => {
|
|
263
|
+
CL ((err, ftry) => {
|
|
264
|
+
if (err) return done(err);
|
|
265
|
+
var mem = ftry.stats (ns, name);
|
|
266
|
+
|
|
267
|
+
async.series([
|
|
268
|
+
cb => mem.clear (cb),
|
|
269
|
+
cb => mem.incr ('l1.l2.c', -1, cb),
|
|
270
|
+
cb => mem.incr ('l1.l2.b', 1, cb),
|
|
271
|
+
cb => mem.incr ('l1.l3.a', 7, cb),
|
|
272
|
+
cb => mem.incr ('v1', 3, cb),
|
|
273
|
+
], (err, results) => {
|
|
274
|
+
setTimeout ( () => mem.values ((err, vals) => {
|
|
275
|
+
vals.should.eql ({
|
|
276
|
+
l1: {
|
|
277
|
+
l2: {
|
|
278
|
+
b: 1,
|
|
279
|
+
c: -1
|
|
280
|
+
},
|
|
281
|
+
l3: {
|
|
282
|
+
a: 7
|
|
283
|
+
}
|
|
284
|
+
},
|
|
285
|
+
v1: 3
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
ftry.close(done);
|
|
289
|
+
}), 200);
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
|
|
254
295
|
});
|
|
255
296
|
});
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
var async = require ('async');
|
|
2
|
+
var should = require ('should');
|
|
3
|
+
var _ = require ('lodash');
|
|
4
|
+
|
|
5
|
+
var LocalSignal = require ('../signal/local');
|
|
6
|
+
var MemStats = require ('../stats/mem');
|
|
7
|
+
|
|
8
|
+
const MongoClient = require ('mongodb').MongoClient;
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
function stats (q, cb) {
|
|
12
|
+
async.series ({
|
|
13
|
+
stats: cb => q.stats(cb),
|
|
14
|
+
tsize: cb => q.totalSize(cb)
|
|
15
|
+
}, (err, res) => {
|
|
16
|
+
// console.log ('stats:', res);
|
|
17
|
+
cb (err, res);
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function get_mq_factory (MQ, opts, cb) {
|
|
22
|
+
const common_opts = {
|
|
23
|
+
url: 'mongodb://localhost/keuss_test_backends_stream_mongo',
|
|
24
|
+
signaller: { provider: LocalSignal},
|
|
25
|
+
stats: {provider: MemStats},
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
// initialize factory
|
|
29
|
+
MQ (_.merge ({}, common_opts, opts), cb);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function release_mq_factory (factory, cb) {
|
|
33
|
+
// console.log ('releasing mq factory');
|
|
34
|
+
|
|
35
|
+
setTimeout (() => {
|
|
36
|
+
factory.close (cb);
|
|
37
|
+
}, 1000);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
42
|
+
[
|
|
43
|
+
{label: 'Stream MongoDB', mq: require ('../backends/stream-mongo')},
|
|
44
|
+
].forEach (MQ_item => {
|
|
45
|
+
describe('stream operations with ' + MQ_item.label + ' queue backend', () => {
|
|
46
|
+
const MQ = MQ_item.mq;
|
|
47
|
+
|
|
48
|
+
beforeEach (done => {
|
|
49
|
+
done();
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
afterEach (done => async.series ([
|
|
53
|
+
cb => setTimeout (cb, 1000),
|
|
54
|
+
cb => MongoClient.connect ('mongodb://localhost/keuss_test_backends_stream_mongo', (err, cl) => {
|
|
55
|
+
if (err) return done (err);
|
|
56
|
+
cl.db().dropDatabase (() => cl.close (cb))
|
|
57
|
+
})
|
|
58
|
+
], done));
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
it('pushes one message, reads it on 3 clients', done => {
|
|
62
|
+
const pl = {elem: 1, pl: 'twetrwte'};
|
|
63
|
+
const hdrs = {aaa: 'qw', bbb: '666'};
|
|
64
|
+
|
|
65
|
+
async.waterfall ([
|
|
66
|
+
cb => get_mq_factory (MQ, {}, cb),
|
|
67
|
+
(factory, cb) => {
|
|
68
|
+
const q0 = factory.queue('test_queue_1', {groups: '000, 001, 002, 003'});
|
|
69
|
+
const q1 = factory.queue('test_queue_1', {group: '000'});
|
|
70
|
+
const q2 = factory.queue('test_queue_1', {group: '001'});
|
|
71
|
+
const q3 = factory.queue('test_queue_1', {group: '002'});
|
|
72
|
+
|
|
73
|
+
async.parallel ([
|
|
74
|
+
cb => setTimeout (() => q0.push (pl, {hdrs}, cb), 1111),
|
|
75
|
+
cb => q1.pop ('c1', cb),
|
|
76
|
+
cb => q2.pop ('c2', cb),
|
|
77
|
+
cb => q3.pop ('c3', cb),
|
|
78
|
+
], (err, res) => {
|
|
79
|
+
if (err) return done (err);
|
|
80
|
+
res[1].should.eql (res[2]);
|
|
81
|
+
res[2].should.eql (res[3]);
|
|
82
|
+
res[1].payload.should.eql (pl);
|
|
83
|
+
res[1].hdrs.should.eql (hdrs);
|
|
84
|
+
cb (err, factory);
|
|
85
|
+
});
|
|
86
|
+
},
|
|
87
|
+
(factory, cb) => release_mq_factory (factory, cb)
|
|
88
|
+
], done);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
it('pushes one message, unaware cients do not get it', done => {
|
|
93
|
+
const pl = {elem: 1, pl: 'twetrwte'};
|
|
94
|
+
const hdrs = {aaa: 'qw', bbb: '666'};
|
|
95
|
+
|
|
96
|
+
async.waterfall ([
|
|
97
|
+
cb => get_mq_factory (MQ, {}, cb),
|
|
98
|
+
(factory, cb) => {
|
|
99
|
+
const q0 = factory.queue('test_queue_1', {groups: '000, 001, 002, 003'});
|
|
100
|
+
const q1 = factory.queue('test_queue_1', {group: '000'});
|
|
101
|
+
const q2 = factory.queue('test_queue_1', {group: '001'});
|
|
102
|
+
const q3 = factory.queue('test_queue_1', {group: '004'});
|
|
103
|
+
const q4 = factory.queue('test_queue_1', {group: '005'});
|
|
104
|
+
|
|
105
|
+
async.parallel ([
|
|
106
|
+
cb => setTimeout (() => q0.push (pl, {hdrs}, cb), 1111),
|
|
107
|
+
cb => q1.pop ('c1', cb),
|
|
108
|
+
cb => q2.pop ('c2', cb),
|
|
109
|
+
cb => q3.pop ('c3', {timeout: 2000}, err => cb (null, err)),
|
|
110
|
+
cb => q4.pop ('c4', {timeout: 2000}, err => cb (null, err)),
|
|
111
|
+
], (err, res) => {
|
|
112
|
+
if (err) return done (err);
|
|
113
|
+
res[1].should.eql (res[2]);
|
|
114
|
+
res[1].payload.should.eql (pl);
|
|
115
|
+
res[1].hdrs.should.eql (hdrs);
|
|
116
|
+
res[3].timeout.should.be.true;
|
|
117
|
+
res[4].timeout.should.be.true;
|
|
118
|
+
cb (err, factory);
|
|
119
|
+
});
|
|
120
|
+
},
|
|
121
|
+
(factory, cb) => release_mq_factory (factory, cb)
|
|
122
|
+
], done);
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it('pushes one message, only on of several clients on same group get it', done => {
|
|
126
|
+
const pl = {elem: 1, pl: 'twetrwte'};
|
|
127
|
+
const hdrs = {aaa: 'qw', bbb: '666'};
|
|
128
|
+
|
|
129
|
+
async.waterfall ([
|
|
130
|
+
cb => get_mq_factory (MQ, {}, cb),
|
|
131
|
+
(factory, cb) => {
|
|
132
|
+
const q0 = factory.queue('test_queue_1', {groups: '000, 001, 002, 003'});
|
|
133
|
+
const q1 = factory.queue('test_queue_1', {group: '000'});
|
|
134
|
+
const q2 = factory.queue('test_queue_1', {group: '000'});
|
|
135
|
+
const q3 = factory.queue('test_queue_1', {group: '001'});
|
|
136
|
+
const q4 = factory.queue('test_queue_1', {group: '001'});
|
|
137
|
+
|
|
138
|
+
async.parallel ([
|
|
139
|
+
cb => setTimeout (() => q0.push (pl, {hdrs}, cb), 1111),
|
|
140
|
+
cb => q1.pop ('c1', {timeout: 2000}, (err, res) => cb (null, res || err)),
|
|
141
|
+
cb => q2.pop ('c2', {timeout: 2000}, (err, res) => cb (null, res || err)),
|
|
142
|
+
cb => q3.pop ('c3', {timeout: 2000}, (err, res) => cb (null, res || err)),
|
|
143
|
+
cb => q4.pop ('c4', {timeout: 2000}, (err, res) => cb (null, res || err)),
|
|
144
|
+
], (err, res) => {
|
|
145
|
+
if (err) return done (err);
|
|
146
|
+
|
|
147
|
+
function __calc__ (ra) {
|
|
148
|
+
const res = {ok:0, ko:0};
|
|
149
|
+
ra.forEach (r => {
|
|
150
|
+
if (r.timeout === true) res.ko++;
|
|
151
|
+
else if (r.payload.elem == 1) res.ok++;
|
|
152
|
+
});
|
|
153
|
+
return res;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
__calc__ ([res[1], res[2]]).should.eql ({ok:1, ko:1});
|
|
157
|
+
__calc__ ([res[3], res[4]]).should.eql ({ok:1, ko:1});
|
|
158
|
+
cb (err, factory);
|
|
159
|
+
});
|
|
160
|
+
},
|
|
161
|
+
(factory, cb) => release_mq_factory (factory, cb)
|
|
162
|
+
], done);
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
});
|
|
166
|
+
});
|