From 3c97e0ebd61f9c29b6d3e3b2e0c4e0052024665a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?z=C5=8Dng=20y=C7=94?= Date: Wed, 6 Mar 2019 10:51:05 +0800 Subject: [PATCH] fix: remove singleton instance after consumer close (#35) --- lib/client/client.js | 5 ++++- lib/client/consumer.js | 1 + test/client/client.test.js | 13 +++++++++++-- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/lib/client/client.js b/lib/client/client.js index fb45af6..79419a4 100644 --- a/lib/client/client.js +++ b/lib/client/client.js @@ -79,11 +79,14 @@ class RpcClient extends Base { debug('create consumer for %s', key); consumerClass = consumerClass || this.consumerClass; consumer = new consumerClass(options); + this._consumerCache.set(key, consumer); // delegate consumer's error to client consumer.on('error', err => { this.emit('error', err); }); consumer.on('request', req => { this.emit('request', req); }); consumer.on('response', info => { this.emit('response', info); }); - this._consumerCache.set(key, consumer); + consumer.once('close', () => { + this._consumerCache.delete(key); + }); } return consumer; } diff --git a/lib/client/consumer.js b/lib/client/consumer.js index 4d6ee4d..8ae6038 100644 --- a/lib/client/consumer.js +++ b/lib/client/consumer.js @@ -168,6 +168,7 @@ class RpcConsumer extends Base { } this.removeAllListeners('request'); this.removeAllListeners('response'); + this.emit('close'); } } diff --git a/test/client/client.test.js b/test/client/client.test.js index b538016..4a75356 100644 --- a/test/client/client.test.js +++ b/test/client/client.test.js @@ -41,7 +41,7 @@ describe('test/client/client.test.js', () => { }); client.consumerClass = RpcConsumer; - const consumer = client.createConsumer({ + let consumer = client.createConsumer({ interfaceName: 'com.alipay.sofa.rpc.test.ProtoService', targetAppName: 'pb', loadbalancerClass: 'consistentHash', @@ -58,12 +58,21 @@ describe('test/client/client.test.js', () => { group: 'A', }]; const ctx = { foo: 'bar' }; - const res = await consumer.invoke('echoObj', args, { ctx }); + let res = await consumer.invoke('echoObj', args, { ctx }); assert.deepEqual(res, { code: 200, message: 'hello Peter, you are in A' }); assert(req && req.targetAppName === 'pb'); assert(req.ctx === ctx); + consumer.close(); + + consumer = client.createConsumer({ + interfaceName: 'com.alipay.sofa.rpc.test.ProtoService', + targetAppName: 'pb', + }); + res = await consumer.invoke('echoObj', args, { ctx }); + assert.deepEqual(res, { code: 200, message: 'hello Peter, you are in A' }); + await client.close(); });