|
@@ -8,13 +8,16 @@ from .DataStream import open_hdf5
|
|
|
from .MerchantWriter import MerchantWriter
|
|
|
from .ChannelWriter import ChannelWriter
|
|
|
from .NetchkWriter import NetchkWriter
|
|
|
+from .WriterConsumer import WriterConsumer
|
|
|
|
|
|
import logging
|
|
|
+
|
|
|
log = logging.getLogger('listener')
|
|
|
|
|
|
+
|
|
|
class QueueListener(object):
|
|
|
- _COUNT = 1
|
|
|
_mQueueName = 'REFILL_MONITOR_QUEUE'
|
|
|
+
|
|
|
def __init__(self):
|
|
|
self._mQuit = False
|
|
|
self._mRHost = ''
|
|
@@ -33,7 +36,7 @@ class QueueListener(object):
|
|
|
'handler': None
|
|
|
}
|
|
|
}
|
|
|
- self._threads = list()
|
|
|
+ self._threads = dict()
|
|
|
self._redis = list()
|
|
|
|
|
|
def set_redis(self, rhost, rport):
|
|
@@ -47,60 +50,76 @@ class QueueListener(object):
|
|
|
log.debug('stop')
|
|
|
self._mQuit = True
|
|
|
|
|
|
+ def _read_queue(self, rclient, queue):
|
|
|
+ while self._mQuit == False:
|
|
|
+ item = rclient.brpop(queue, 1)
|
|
|
+ if item is None:
|
|
|
+ continue
|
|
|
+ else:
|
|
|
+ try:
|
|
|
+ val = json.loads(item[1])
|
|
|
+ method = val['method']
|
|
|
+ params = val['params']
|
|
|
+ self._dispatch(method, params)
|
|
|
+ except Exception as ex:
|
|
|
+ log.error(ex)
|
|
|
+ pass
|
|
|
+
|
|
|
def prepare_data(self):
|
|
|
+ while self._mQuit == False:
|
|
|
try:
|
|
|
+ self._threads.clear()
|
|
|
for _key, val in self._mHandlers.items():
|
|
|
hfive = open_hdf5(val['name'], True)
|
|
|
if _key == 'merchant':
|
|
|
val['handler'] = MerchantWriter(hfive)
|
|
|
+ self._threads['merchant'] = WriterConsumer(val['handler'])
|
|
|
elif _key == 'channel':
|
|
|
val['handler'] = ChannelWriter(hfive)
|
|
|
+ self._threads['channel'] = WriterConsumer(val['handler'])
|
|
|
elif _key == 'netchk':
|
|
|
val['handler'] = NetchkWriter(hfive)
|
|
|
+ self._threads['netchk'] = WriterConsumer(val['handler'])
|
|
|
else:
|
|
|
pass
|
|
|
|
|
|
- self._pool = redis.ConnectionPool(host=self._mRHost, port=self._mRPort, db=0)
|
|
|
- for i in range(0, self._COUNT):
|
|
|
- r = redis.Redis(connection_pool=self._pool)
|
|
|
- thread = Thread(target=read_queue,args=(self,r,self._mQueueName))
|
|
|
- self._redis.append(r)
|
|
|
- self._threads.append(thread)
|
|
|
+ for name, thread in self._threads.items():
|
|
|
thread.start()
|
|
|
|
|
|
- log.debug('quit prepare data')
|
|
|
- for thread in self._threads:
|
|
|
+ self._pool = redis.ConnectionPool(host=self._mRHost, port=self._mRPort, db=0)
|
|
|
+ r = redis.Redis(connection_pool=self._pool)
|
|
|
+ self._read_queue(r, self._mQueueName)
|
|
|
+
|
|
|
+ for name, thread in self._threads.items():
|
|
|
thread.join()
|
|
|
- log.debug('join')
|
|
|
+ log.debug("thread %s has quit", name)
|
|
|
except Exception as ex:
|
|
|
log.error(ex)
|
|
|
finally:
|
|
|
self._close()
|
|
|
|
|
|
- def write(self,method, params):
|
|
|
+ def _dispatch(self, method, params):
|
|
|
def find_handler(method):
|
|
|
- # log.debug(method)
|
|
|
if method in ['mch_submit', 'mch_succ', 'mch_fail']:
|
|
|
file_type = 'merchant'
|
|
|
- elif method in ['ch_commit','ch_succ', 'ch_fail']:
|
|
|
+ elif method in ['ch_commit', 'ch_succ', 'ch_fail']:
|
|
|
file_type = 'channel'
|
|
|
elif method in ['net_succ', 'net_fail']:
|
|
|
file_type = 'netchk'
|
|
|
else:
|
|
|
- return None
|
|
|
- return self._mHandlers[file_type]['handler']
|
|
|
+ file_type = None
|
|
|
+
|
|
|
+ return file_type
|
|
|
|
|
|
try:
|
|
|
- # log.debug('start write')
|
|
|
- handler = find_handler(method)
|
|
|
- if handler is not None:
|
|
|
- handler.write(method, params)
|
|
|
- # log.debug('end write')
|
|
|
+ file_type = find_handler(method)
|
|
|
+ if file_type is not None:
|
|
|
+ self._threads[file_type].put(method, params)
|
|
|
except Exception as ex:
|
|
|
log.error(ex)
|
|
|
|
|
|
def flush(self):
|
|
|
- for key,val in self._mHandlers.items():
|
|
|
+ for key, val in self._mHandlers.items():
|
|
|
handler = val['handler']
|
|
|
if handler is not None:
|
|
|
handler.flush()
|
|
@@ -114,40 +133,4 @@ class QueueListener(object):
|
|
|
log.info(handler)
|
|
|
|
|
|
|
|
|
-def bread_queue(listener: QueueListener, redis,queue):
|
|
|
- while listener.has_stop() == False:
|
|
|
- item = redis.brpop(queue, 1)
|
|
|
- if item is None:
|
|
|
- continue
|
|
|
- else:
|
|
|
- try:
|
|
|
- val = json.loads(item[1])
|
|
|
- method = val['method']
|
|
|
- params = val['params']
|
|
|
- listener.write(method, params)
|
|
|
- except Exception as ex:
|
|
|
- log.error(ex)
|
|
|
- pass
|
|
|
-
|
|
|
-def read_queue(listener: QueueListener, redis,queue):
|
|
|
- flush_time = 0
|
|
|
- while listener.has_stop() == False:
|
|
|
- item = redis.rpop(queue) #测试每秒性能在三万多.
|
|
|
- if item is None:
|
|
|
- time.sleep(1)
|
|
|
- else:
|
|
|
- try:
|
|
|
- val = json.loads(item)
|
|
|
- method = val['method']
|
|
|
- params = val['params']
|
|
|
- listener.write(method, params)
|
|
|
- cur_time = int(time.time())
|
|
|
-
|
|
|
- if cur_time > flush_time:
|
|
|
- listener.flush()
|
|
|
- flush_time = cur_time
|
|
|
- except Exception as ex:
|
|
|
- log.error(ex)
|
|
|
- pass
|
|
|
-
|
|
|
queueListener = QueueListener()
|