funboost 44.2__py3-none-any.whl → 44.4__py3-none-any.whl
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.
Potentially problematic release.
This version of funboost might be problematic. Click here for more details.
- funboost/__init__.py +1 -1
- funboost/concurrent_pool/async_helper.py +3 -1
- funboost/consumers/base_consumer.py +30 -23
- funboost/consumers/http_consumer.py +1 -1
- funboost/consumers/http_consumer000.py +1 -2
- funboost/consumers/httpsqs_consumer.py +1 -1
- funboost/consumers/kafka_consumer.py +1 -1
- funboost/consumers/kafka_consumer_manually_commit.py +2 -2
- funboost/consumers/kombu_consumer.py +0 -1
- funboost/consumers/local_python_queue_consumer.py +2 -3
- funboost/consumers/memory_deque_consumer.py +0 -3
- funboost/consumers/mongomq_consumer.py +0 -1
- funboost/consumers/mqtt_consumer.py +1 -1
- funboost/consumers/nats_consumer.py +1 -1
- funboost/consumers/nsq_consumer.py +1 -2
- funboost/consumers/peewee_conusmer.py +1 -2
- funboost/consumers/persist_queue_consumer.py +1 -2
- funboost/consumers/pulsar_consumer.py +1 -2
- funboost/consumers/rabbitmq_amqpstorm_consumer.py +0 -2
- funboost/consumers/rabbitmq_pika_consumer.py +0 -2
- funboost/consumers/rabbitmq_pika_consumerv0.py +0 -1
- funboost/consumers/rabbitmq_rabbitpy_consumer.py +1 -2
- funboost/consumers/redis_brpoplpush_consumer.py +1 -3
- funboost/consumers/redis_consumer.py +4 -8
- funboost/consumers/redis_consumer_ack_able.py +5 -10
- funboost/consumers/redis_consumer_priority.py +3 -7
- funboost/consumers/redis_consumer_simple.py +2 -3
- funboost/consumers/redis_pubsub_consumer.py +3 -3
- funboost/consumers/redis_stream_consumer.py +3 -3
- funboost/consumers/rocketmq_consumer.py +2 -2
- funboost/consumers/sqlachemy_consumer.py +1 -1
- funboost/consumers/tcp_consumer.py +2 -2
- funboost/consumers/txt_file_consumer.py +2 -2
- funboost/consumers/udp_consumer.py +2 -2
- funboost/consumers/zeromq_consumer.py +1 -2
- funboost/core/booster.py +17 -2
- funboost/core/cli/discovery_boosters.py +2 -2
- funboost/core/funboost_time.py +26 -9
- funboost/core/helper_funs.py +16 -2
- funboost/core/lazy_impoter.py +30 -37
- funboost/core/loggers.py +3 -3
- funboost/core/muliti_process_enhance.py +3 -3
- funboost/funboost_config_deafult.py +1 -1
- funboost/utils/decorators.py +14 -0
- funboost/utils/paramiko_util.py +1 -1
- {funboost-44.2.dist-info → funboost-44.4.dist-info}/METADATA +9 -3
- {funboost-44.2.dist-info → funboost-44.4.dist-info}/RECORD +51 -51
- {funboost-44.2.dist-info → funboost-44.4.dist-info}/LICENSE +0 -0
- {funboost-44.2.dist-info → funboost-44.4.dist-info}/WHEEL +0 -0
- {funboost-44.2.dist-info → funboost-44.4.dist-info}/entry_points.txt +0 -0
- {funboost-44.2.dist-info → funboost-44.4.dist-info}/top_level.txt +0 -0
funboost/__init__.py
CHANGED
|
@@ -2,9 +2,11 @@ from functools import partial
|
|
|
2
2
|
import asyncio
|
|
3
3
|
from concurrent.futures import Executor
|
|
4
4
|
from funboost.concurrent_pool.custom_threadpool_executor import ThreadPoolExecutorShrinkAble
|
|
5
|
+
# from funboost.concurrent_pool.flexible_thread_pool import FlexibleThreadPool
|
|
5
6
|
|
|
6
7
|
# 没有使用内置的concurrent.futures.ThreadpoolExecutor线程池,而是使用智能伸缩线程池。
|
|
7
|
-
async_executor_default = ThreadPoolExecutorShrinkAble()
|
|
8
|
+
async_executor_default = ThreadPoolExecutorShrinkAble(500)
|
|
9
|
+
# async_executor_default = FlexibleThreadPool(50) # 这个不支持future特性
|
|
8
10
|
|
|
9
11
|
|
|
10
12
|
async def simple_run_in_executor(f, *args, async_executor: Executor = None, async_loop=None, **kwargs):
|
|
@@ -30,13 +30,12 @@ from threading import Lock
|
|
|
30
30
|
import asyncio
|
|
31
31
|
|
|
32
32
|
import nb_log
|
|
33
|
-
from funboost.core.current_task import funboost_current_task
|
|
33
|
+
from funboost.core.current_task import funboost_current_task
|
|
34
34
|
from funboost.core.loggers import develop_logger
|
|
35
35
|
|
|
36
36
|
from funboost.core.func_params_model import BoosterParams, PublisherParams, BaseJsonAbleModel
|
|
37
37
|
from funboost.core.task_id_logger import TaskIdLogger
|
|
38
|
-
from nb_log import (get_logger, LoggerLevelSetterMixin, LogManager,
|
|
39
|
-
LoggerMixinDefaultWithFileHandler, stdout_write, is_main_process,
|
|
38
|
+
from nb_log import (get_logger, LoggerLevelSetterMixin, LogManager, is_main_process,
|
|
40
39
|
nb_log_config_default)
|
|
41
40
|
from funboost.core.loggers import FunboostFileLoggerMixin, logger_prompt
|
|
42
41
|
|
|
@@ -71,7 +70,7 @@ from funboost.core import kill_remote_task
|
|
|
71
70
|
from funboost.core.exceptions import ExceptionForRequeue, ExceptionForPushToDlxqueue
|
|
72
71
|
|
|
73
72
|
# from funboost.core.booster import BoostersManager 互相导入
|
|
74
|
-
from funboost.core.lazy_impoter import
|
|
73
|
+
from funboost.core.lazy_impoter import funboost_lazy_impoter
|
|
75
74
|
|
|
76
75
|
|
|
77
76
|
# patch_apscheduler_run_job()
|
|
@@ -174,6 +173,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
174
173
|
broker_exclusive_config_merge = dict()
|
|
175
174
|
broker_exclusive_config_merge.update(self.BROKER_EXCLUSIVE_CONFIG_DEFAULT)
|
|
176
175
|
broker_exclusive_config_merge.update(self.consumer_params.broker_exclusive_config)
|
|
176
|
+
# print(broker_exclusive_config_merge)
|
|
177
177
|
self.consumer_params.broker_exclusive_config = broker_exclusive_config_merge
|
|
178
178
|
|
|
179
179
|
self._stop_flag = None
|
|
@@ -222,7 +222,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
222
222
|
# log_filename=consumer_params.log_filename,
|
|
223
223
|
# logger_name=consumer_params.logger_name,
|
|
224
224
|
# broker_exclusive_config=self.consumer_params.broker_exclusive_config)
|
|
225
|
-
self.publisher_params = BaseJsonAbleModel.init_by_another_model(PublisherParams, consumer_params)
|
|
225
|
+
self.publisher_params = BaseJsonAbleModel.init_by_another_model(PublisherParams, self.consumer_params)
|
|
226
226
|
# print(self.publisher_params)
|
|
227
227
|
if is_main_process:
|
|
228
228
|
self.logger.info(f'{self.queue_name} consumer 的消费者配置:\n {self.consumer_params.json_str_value()}')
|
|
@@ -322,16 +322,16 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
322
322
|
# ConsumersManager.show_all_consumer_info()
|
|
323
323
|
# noinspection PyBroadException
|
|
324
324
|
pid_queue_name_tuple = (os.getpid(), self.queue_name)
|
|
325
|
-
if pid_queue_name_tuple in
|
|
325
|
+
if pid_queue_name_tuple in funboost_lazy_impoter.BoostersManager.pid_queue_name__has_start_consume_set:
|
|
326
326
|
self.logger.warning(f'{pid_queue_name_tuple} 已启动消费,不要一直去启动消费,funboost框架自动阻止.') # 有的人乱写代码,无数次在函数内部或for循环里面执行 f.consume(),一个队列只需要启动一次消费,不然每启动一次性能消耗很大,直到程序崩溃
|
|
327
327
|
return
|
|
328
328
|
else:
|
|
329
|
-
|
|
329
|
+
funboost_lazy_impoter.BoostersManager.pid_queue_name__has_start_consume_set.add(pid_queue_name_tuple)
|
|
330
330
|
GlobalVars.has_start_a_consumer_flag = True
|
|
331
331
|
try:
|
|
332
332
|
self._concurrent_mode_dispatcher.check_all_concurrent_mode()
|
|
333
333
|
self._check_monkey_patch()
|
|
334
|
-
except BaseException:
|
|
334
|
+
except BaseException: # noqa
|
|
335
335
|
traceback.print_exc()
|
|
336
336
|
os._exit(4444) # noqa
|
|
337
337
|
self.logger.info(f'开始消费 {self._queue_name} 中的消息')
|
|
@@ -373,7 +373,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
373
373
|
key = 'apscheduler.redisjobstore_runonce'
|
|
374
374
|
if RedisMixin().redis_db_frame.sadd(key, runonce_uuid): # 这样可以阻止多次启动同队列名消费者 redis jobstore多次运行函数.
|
|
375
375
|
cls.logger_apscheduler.debug(f'延时任务用普通消息重新发布到普通队列 {msg}')
|
|
376
|
-
|
|
376
|
+
funboost_lazy_impoter.BoostersManager.get_or_create_booster_by_queue_name(queue_name).publish(msg)
|
|
377
377
|
|
|
378
378
|
@abc.abstractmethod
|
|
379
379
|
def _shedual_task(self):
|
|
@@ -383,10 +383,10 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
383
383
|
"""
|
|
384
384
|
raise NotImplementedError
|
|
385
385
|
|
|
386
|
-
def convert_msg_before_run(self, msg: dict):
|
|
386
|
+
def convert_msg_before_run(self, msg: typing.Union[str, dict]) -> dict:
|
|
387
387
|
"""
|
|
388
388
|
转换消息,消息没有使用funboost来发送,并且没有extra相关字段时候
|
|
389
|
-
用户也可以按照4.21文档,继承任意Consumer类,并实现这个方法 convert_msg_before_run
|
|
389
|
+
用户也可以按照4.21文档,继承任意Consumer类,并实现这个方法 convert_msg_before_run,先转换不规范的消息.
|
|
390
390
|
"""
|
|
391
391
|
""" 一般消息至少包含这样
|
|
392
392
|
{
|
|
@@ -404,6 +404,9 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
404
404
|
extra_params = {'task_id': task_id, 'publish_time': round(time.time(), 4),
|
|
405
405
|
'publish_time_format': time.strftime('%Y-%m-%d %H:%M:%S')}
|
|
406
406
|
"""
|
|
407
|
+
if isinstance(msg, str):
|
|
408
|
+
msg = json.loads(msg)
|
|
409
|
+
# 以下是清洗补全字段.
|
|
407
410
|
if 'extra' not in msg:
|
|
408
411
|
msg['extra'] = {'is_auto_fill_extra': True}
|
|
409
412
|
extra = msg['extra']
|
|
@@ -413,6 +416,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
413
416
|
extra['publish_time'] = MsgGenerater.generate_publish_time()
|
|
414
417
|
if 'publish_time_format':
|
|
415
418
|
extra['publish_time_format'] = MsgGenerater.generate_publish_time_format()
|
|
419
|
+
return msg
|
|
416
420
|
|
|
417
421
|
def _submit_task(self, kw):
|
|
418
422
|
while 1: # 这一块的代码为支持暂停消费。
|
|
@@ -424,12 +428,12 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
424
428
|
self._last_show_pause_log_time = time.time()
|
|
425
429
|
else:
|
|
426
430
|
break
|
|
427
|
-
|
|
431
|
+
self._print_message_get_from_broker(kw['body'])
|
|
432
|
+
kw['body'] = self.convert_msg_before_run(kw['body'])
|
|
428
433
|
if self._judge_is_daylight():
|
|
429
434
|
self._requeue(kw)
|
|
430
435
|
time.sleep(self.time_interval_for_check_do_not_run_time)
|
|
431
436
|
return
|
|
432
|
-
self.convert_msg_before_run(kw['body'])
|
|
433
437
|
function_only_params = delete_keys_and_return_new_dict(kw['body'], )
|
|
434
438
|
if self._get_priority_conf(kw, 'do_task_filtering') and self._redis_filter.check_value_exists(
|
|
435
439
|
function_only_params): # 对函数的参数进行检查,过滤已经执行过并且成功的任务。
|
|
@@ -524,12 +528,13 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
524
528
|
if self._has_execute_times_in_recent_second >= qpsx:
|
|
525
529
|
time.sleep((1 - (time.time() - self._last_start_count_qps_timestamp)) * 1)
|
|
526
530
|
|
|
527
|
-
def _print_message_get_from_broker(self,
|
|
531
|
+
def _print_message_get_from_broker(self, msg, broker_name=None):
|
|
528
532
|
# print(999)
|
|
529
533
|
if self.consumer_params.is_show_message_get_from_broker:
|
|
530
534
|
if isinstance(msg, (dict, list)):
|
|
531
535
|
msg = json.dumps(msg, ensure_ascii=False)
|
|
532
|
-
self.logger.debug(f'从 {broker_name} 中间件 的 {self._queue_name} 中取出的消息是 {msg}')
|
|
536
|
+
# self.logger.debug(f'从 {broker_name} 中间件 的 {self._queue_name} 中取出的消息是 {msg}')
|
|
537
|
+
self.logger.debug(f'从 {broker_name or self.consumer_params.broker_kind} 中间件 的 {self._queue_name} 中取出的消息是 {msg}')
|
|
533
538
|
|
|
534
539
|
def _get_priority_conf(self, kw: dict, broker_task_config_key: str):
|
|
535
540
|
broker_task_config = kw['body'].get('extra', {}).get(broker_task_config_key, None)
|
|
@@ -617,13 +622,15 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
617
622
|
msg = f'{self._unit_time_for_count} 秒内执行了 {self._execute_task_times_every_unit_time} 次函数 [ {self.consuming_function.__name__} ] ,' \
|
|
618
623
|
f'函数平均运行耗时 {avarage_function_spend_time} 秒。 '
|
|
619
624
|
self.logger.info(msg)
|
|
620
|
-
if
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
625
|
+
if time.time() - self._last_show_remaining_execution_time > self._show_remaining_execution_time_interval:
|
|
626
|
+
self._msg_num_in_broker = self.publisher_of_same_queue.get_message_count()
|
|
627
|
+
if self._msg_num_in_broker != -1 : # 有的中间件无法统计或没实现统计队列剩余数量的,统一返回的是-1,不显示这句话。
|
|
628
|
+
# msg += f''' ,预计还需要 {time_util.seconds_to_hour_minute_second(self._msg_num_in_broker * avarage_function_spend_time / active_consumer_num)} 时间 才能执行完成 {self._msg_num_in_broker}个剩余的任务'''
|
|
629
|
+
need_time = time_util.seconds_to_hour_minute_second(self._msg_num_in_broker / (self._execute_task_times_every_unit_time / self._unit_time_for_count) /
|
|
630
|
+
self._distributed_consumer_statistics.active_consumer_num)
|
|
631
|
+
msg += f''' 预计还需要 {need_time} 时间 才能执行完成 队列 {self.queue_name} 中的 {self._msg_num_in_broker} 个剩余任务'''
|
|
632
|
+
self.logger.info(msg)
|
|
633
|
+
self._last_show_remaining_execution_time = time.time()
|
|
627
634
|
self._current_time_for_execute_task_times_every_unit_time = time.time()
|
|
628
635
|
self._consuming_function_cost_time_total_every_unit_time = 0
|
|
629
636
|
self._execute_task_times_every_unit_time = 0
|
|
@@ -823,7 +830,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
823
830
|
self.logger.critical(msg=log_msg)
|
|
824
831
|
# noinspection PyProtectedMember,PyUnresolvedReferences
|
|
825
832
|
os._exit(444)
|
|
826
|
-
if not self.consumer_params.function_timeout
|
|
833
|
+
if not self.consumer_params.function_timeout:
|
|
827
834
|
rs = await corotinue_obj
|
|
828
835
|
# rs = await asyncio.wait_for(corotinue_obj, timeout=4)
|
|
829
836
|
else:
|
|
@@ -49,7 +49,7 @@ class HTTPConsumer(AbstractConsumer, ):
|
|
|
49
49
|
async def recv_msg(request: AioHttpImporter().Request):
|
|
50
50
|
data = await request.post()
|
|
51
51
|
msg = data['msg']
|
|
52
|
-
kw = {'body':
|
|
52
|
+
kw = {'body': msg}
|
|
53
53
|
self._submit_task(kw)
|
|
54
54
|
return AioHttpImporter().web.Response(text="finish")
|
|
55
55
|
|
|
@@ -60,8 +60,7 @@ class HttpHandler(BaseHTTPRequestHandler):
|
|
|
60
60
|
if self.path == '/queue':
|
|
61
61
|
msg = form['msg'].value
|
|
62
62
|
# print(msg)
|
|
63
|
-
|
|
64
|
-
kw = {'body': json.loads(msg)}
|
|
63
|
+
kw = {'body': msg}
|
|
65
64
|
self.consumer._submit_task(kw)
|
|
66
65
|
|
|
67
66
|
# 开始回复
|
|
@@ -61,7 +61,7 @@ class KafkaConsumer(AbstractConsumer):
|
|
|
61
61
|
if self.consumer_params.is_show_message_get_from_broker:
|
|
62
62
|
self.logger.debug(
|
|
63
63
|
f'从kafka的 [{message.topic}] 主题,分区 {message.partition} 中 取出的消息是: {message.value.decode()}')
|
|
64
|
-
kw = {'consumer': consumer, 'message': message, 'body':
|
|
64
|
+
kw = {'consumer': consumer, 'message': message, 'body': message.value}
|
|
65
65
|
self._submit_task(kw)
|
|
66
66
|
|
|
67
67
|
def _confirm_consume(self, kw):
|
|
@@ -66,7 +66,7 @@ class KafkaConsumerManuallyCommit(AbstractConsumer):
|
|
|
66
66
|
# value() offset() partition()
|
|
67
67
|
# print('Received message: {}'.format(msg.value().decode('utf-8'))) # noqa
|
|
68
68
|
self._partion__offset_consume_status_map[msg.partition()][msg.offset()] = 0
|
|
69
|
-
kw = {'partition': msg.partition(), 'offset': msg.offset(), 'body':
|
|
69
|
+
kw = {'partition': msg.partition(), 'offset': msg.offset(), 'body': msg.value()} # noqa
|
|
70
70
|
if self.consumer_params.is_show_message_get_from_broker:
|
|
71
71
|
self.logger.debug(
|
|
72
72
|
f'从kafka的 [{self._queue_name}] 主题,分区 {msg.partition()} 中 的 offset {msg.offset()} 取出的消息是: {msg.value()}') # noqa
|
|
@@ -165,7 +165,7 @@ class SaslPlainKafkaConsumer(KafkaConsumerManuallyCommit):
|
|
|
165
165
|
# print('Received message: {}'.format(msg.value().decode('utf-8'))) # noqa
|
|
166
166
|
self._partion__offset_consume_status_map[msg.partition(
|
|
167
167
|
)][msg.offset()] = 0
|
|
168
|
-
kw = {'partition': msg.partition(), 'offset': msg.offset(), 'body':
|
|
168
|
+
kw = {'partition': msg.partition(), 'offset': msg.offset(), 'body': msg.value()} # noqa
|
|
169
169
|
if self.consumer_params.is_show_message_get_from_broker:
|
|
170
170
|
self.logger.debug(
|
|
171
171
|
f'从kafka的 [{self._queue_name}] 主题,分区 {msg.partition()} 中 的 offset {msg.offset()} 取出的消息是: {msg.value()}') # noqa
|
|
@@ -194,7 +194,6 @@ Transport Options
|
|
|
194
194
|
|
|
195
195
|
def callback(body: dict, message: Message):
|
|
196
196
|
# print(type(body),body,type(message),message)
|
|
197
|
-
self._print_message_get_from_broker('kombu', body)
|
|
198
197
|
# self.logger.debug(f""" 从 kombu {self._middware_name} 中取出的消息是 {body}""")
|
|
199
198
|
kw = {'body': body, 'message': message, }
|
|
200
199
|
self._submit_task(kw)
|
|
@@ -20,9 +20,8 @@ class LocalPythonQueueConsumer(AbstractConsumer):
|
|
|
20
20
|
def _shedual_task(self):
|
|
21
21
|
while True:
|
|
22
22
|
task = self.local_python_queue.get()
|
|
23
|
-
if isinstance(task,
|
|
24
|
-
task = json.
|
|
25
|
-
self._print_message_get_from_broker('当前python解释器内部', task)
|
|
23
|
+
if isinstance(task, dict):
|
|
24
|
+
task = json.dumps(task)
|
|
26
25
|
# self.logger.debug(f'从当前python解释器内部的 [{self._queue_name}] 队列中 取出的消息是: {json.dumps(task)} ')
|
|
27
26
|
kw = {'body': task}
|
|
28
27
|
self._submit_task(kw)
|
|
@@ -21,9 +21,6 @@ class LocalPythonQueueConsumer(AbstractConsumer):
|
|
|
21
21
|
def _shedual_task(self):
|
|
22
22
|
while True:
|
|
23
23
|
task = self.local_python_queue.popleft()
|
|
24
|
-
if isinstance(task, str):
|
|
25
|
-
task = json.loads(task)
|
|
26
|
-
self._print_message_get_from_broker('当前python解释器内部', task)
|
|
27
24
|
# self.logger.debug(f'从当前python解释器内部的 [{self._queue_name}] 队列中 取出的消息是: {json.dumps(task)} ')
|
|
28
25
|
kw = {'body': task}
|
|
29
26
|
self._submit_task(kw)
|
|
@@ -19,7 +19,6 @@ class MongoMqConsumer(AbstractConsumer, MongoMixin):
|
|
|
19
19
|
job = mp.queue.next()
|
|
20
20
|
if job is not None:
|
|
21
21
|
# self.logger.debug(f'从mongo的 [{self._queue_name}] 队列中 取出的消息是: 消息是: {job.payload} ')
|
|
22
|
-
self._print_message_get_from_broker('mongo', job.payload)
|
|
23
22
|
kw = {'body': job.payload, 'job': job}
|
|
24
23
|
self._submit_task(kw)
|
|
25
24
|
else:
|
|
@@ -48,7 +48,7 @@ class MqttConsumer(AbstractConsumer):
|
|
|
48
48
|
# noinspection PyUnusedLocal
|
|
49
49
|
def _on_message(self, client, userdata, msg):
|
|
50
50
|
# print(msg.topic + " " + str(msg.payload))
|
|
51
|
-
kw = {'body':
|
|
51
|
+
kw = {'body': msg.payload}
|
|
52
52
|
self._submit_task(kw)
|
|
53
53
|
|
|
54
54
|
def _confirm_consume(self, kw):
|
|
@@ -21,7 +21,7 @@ class NatsConsumer(AbstractConsumer):
|
|
|
21
21
|
# print(type(msg))
|
|
22
22
|
# print(msg.reply)
|
|
23
23
|
# print(f"Received a message with subject {msg.subject}: {msg.payload}")
|
|
24
|
-
kw = {'body':
|
|
24
|
+
kw = {'body': msg.payload}
|
|
25
25
|
self._submit_task(kw)
|
|
26
26
|
|
|
27
27
|
nats_client.subscribe(subject=self.queue_name, callback=callback)
|
|
@@ -27,10 +27,9 @@ class NsqConsumer(AbstractConsumer):
|
|
|
27
27
|
@consumer.on_message.connect
|
|
28
28
|
def handler(consumerx: GnsqImporter().Consumer, message: GnsqImporter().Message):
|
|
29
29
|
# 第一条消息不能并发,第一条消息之后可以并发。
|
|
30
|
-
self._print_message_get_from_broker('nsq', message.body.decode())
|
|
31
30
|
# self.logger.debug(f'从nsq的 [{self._queue_name}] 主题中 取出的消息是: {message.body.decode()}')
|
|
32
31
|
message.enable_async()
|
|
33
|
-
kw = {'consumer': consumerx, 'message': message, 'body':
|
|
32
|
+
kw = {'consumer': consumerx, 'message': message, 'body': message.body}
|
|
34
33
|
self._submit_task(kw)
|
|
35
34
|
|
|
36
35
|
consumer.start()
|
|
@@ -20,8 +20,7 @@ class PeeweeConsumer(AbstractConsumer):
|
|
|
20
20
|
task_dict = self.queue.get()
|
|
21
21
|
# print(task_dict)
|
|
22
22
|
# self.logger.debug(f'从数据库 {frame_config.SQLACHEMY_ENGINE_URL[:25]}。。 的 [{self._queue_name}] 队列中 取出的消息是: 消息是: {sqla_task_dict}')
|
|
23
|
-
|
|
24
|
-
kw = {'body':json.loads(task_dict['body']), 'job_id': task_dict['job_id']}
|
|
23
|
+
kw = {'body':task_dict['body'], 'job_id': task_dict['job_id']}
|
|
25
24
|
self._submit_task(kw)
|
|
26
25
|
|
|
27
26
|
def _confirm_consume(self, kw):
|
|
@@ -17,8 +17,7 @@ class PersistQueueConsumer(AbstractConsumer):
|
|
|
17
17
|
while True:
|
|
18
18
|
item = pub.queue.get()
|
|
19
19
|
# self.logger.debug(f'从本地持久化sqlite的 [{self._queue_name}] 队列中 取出的消息是: {item} ')
|
|
20
|
-
|
|
21
|
-
kw = {'body': json.loads(item), 'q': pub.queue, 'item': item}
|
|
20
|
+
kw = {'body': item, 'q': pub.queue, 'item': item}
|
|
22
21
|
self._submit_task(kw)
|
|
23
22
|
|
|
24
23
|
def _confirm_consume(self, kw):
|
|
@@ -53,8 +53,7 @@ class PulsarConsumer(AbstractConsumer, ):
|
|
|
53
53
|
while True:
|
|
54
54
|
msg = self._consumer.receive()
|
|
55
55
|
if msg:
|
|
56
|
-
|
|
57
|
-
kw = {'body': json.loads(msg.data()), 'msg': msg}
|
|
56
|
+
kw = {'body': msg.data(), 'msg': msg}
|
|
58
57
|
self._submit_task(kw)
|
|
59
58
|
|
|
60
59
|
def _confirm_consume(self, kw):
|
|
@@ -21,8 +21,6 @@ class RabbitmqConsumerAmqpStorm(AbstractConsumer):
|
|
|
21
21
|
def callback(amqpstorm_message: amqpstorm.Message):
|
|
22
22
|
body = amqpstorm_message.body
|
|
23
23
|
# self.logger.debug(f'从rabbitmq的 [{self._queue_name}] 队列中 取出的消息是: {body}')
|
|
24
|
-
self._print_message_get_from_broker('rabbitmq', body)
|
|
25
|
-
body = json.loads(body)
|
|
26
24
|
kw = {'amqpstorm_message': amqpstorm_message, 'body': body}
|
|
27
25
|
self._submit_task(kw)
|
|
28
26
|
|
|
@@ -37,8 +37,6 @@ class RabbitmqConsumer(AbstractConsumer):
|
|
|
37
37
|
def callback(ch, method, properties, body):
|
|
38
38
|
body = body.decode()
|
|
39
39
|
# self.logger.debug(f'从rabbitmq的 [{self._queue_name}] 队列中 取出的消息是: {body}')
|
|
40
|
-
self._print_message_get_from_broker('rabbitmq', body)
|
|
41
|
-
body = json.loads(body)
|
|
42
40
|
kw = {'ch': ch, 'method': method, 'properties': properties, 'body': body}
|
|
43
41
|
self._submit_task(kw)
|
|
44
42
|
|
|
@@ -34,7 +34,6 @@ class RabbitmqConsumer(AbstractConsumer):
|
|
|
34
34
|
def callback(ch, method, properties, body):
|
|
35
35
|
body = body.decode()
|
|
36
36
|
self.logger.debug(f'从rabbitmq的 [{self._queue_name}] 队列中 取出的消息是: {body}')
|
|
37
|
-
body = json.loads(body)
|
|
38
37
|
kw = {'ch': ch, 'method': method, 'properties': properties, 'body': body}
|
|
39
38
|
self._submit_task(kw)
|
|
40
39
|
|
|
@@ -23,8 +23,7 @@ class RabbitmqConsumerRabbitpy(AbstractConsumer):
|
|
|
23
23
|
for message in channel.basic_consume(self._queue_name, no_ack=False):
|
|
24
24
|
body = message.body.decode()
|
|
25
25
|
# self.logger.debug(f'从rabbitmq {self._queue_name} 队列中 取出的消息是: {body}')
|
|
26
|
-
|
|
27
|
-
kw = {'message': message, 'body': json.loads(message.body.decode())}
|
|
26
|
+
kw = {'message': message, 'body': body}
|
|
28
27
|
self._submit_task(kw)
|
|
29
28
|
|
|
30
29
|
def _confirm_consume(self, kw):
|
|
@@ -27,9 +27,7 @@ class RedisBrpopLpushConsumer(AbstractConsumer, RedisMixin):
|
|
|
27
27
|
while True:
|
|
28
28
|
msg = self.redis_db_frame.brpoplpush(self._queue_name, unack_list_name, timeout=60)
|
|
29
29
|
if msg:
|
|
30
|
-
|
|
31
|
-
task_dict = json.loads(msg)
|
|
32
|
-
kw = {'body': task_dict, 'raw_msg': msg}
|
|
30
|
+
kw = {'body': msg, 'raw_msg': msg}
|
|
33
31
|
self._submit_task(kw)
|
|
34
32
|
|
|
35
33
|
def _confirm_consume(self, kw):
|
|
@@ -34,17 +34,15 @@ class RedisConsumer(AbstractConsumer, RedisMixin):
|
|
|
34
34
|
task_str_list = p.execute()[0]
|
|
35
35
|
if task_str_list:
|
|
36
36
|
# self.logger.debug(f'从redis的 [{self._queue_name}] 队列中 取出的消息是: {task_str_list} ')
|
|
37
|
-
self._print_message_get_from_broker(
|
|
37
|
+
self._print_message_get_from_broker( task_str_list)
|
|
38
38
|
for task_str in task_str_list:
|
|
39
|
-
kw = {'body':
|
|
39
|
+
kw = {'body': task_str}
|
|
40
40
|
self._submit_task(kw)
|
|
41
41
|
else:
|
|
42
42
|
result = self.redis_db_frame.brpop(self._queue_name, timeout=60)
|
|
43
43
|
if result:
|
|
44
44
|
# self.logger.debug(f'从redis的 [{self._queue_name}] 队列中 取出的消息是: {result[1].decode()} ')
|
|
45
|
-
|
|
46
|
-
task_dict = json.loads(result[1])
|
|
47
|
-
kw = {'body': task_dict}
|
|
45
|
+
kw = {'body': result[1]}
|
|
48
46
|
self._submit_task(kw)
|
|
49
47
|
|
|
50
48
|
def _shedual_task00(self):
|
|
@@ -52,9 +50,7 @@ class RedisConsumer(AbstractConsumer, RedisMixin):
|
|
|
52
50
|
result = self.redis_db_frame.blpop(self._queue_name, timeout=60)
|
|
53
51
|
if result:
|
|
54
52
|
# self.logger.debug(f'从redis的 [{self._queue_name}] 队列中 取出的消息是: {result[1].decode()} ')
|
|
55
|
-
|
|
56
|
-
task_dict = json.loads(result[1])
|
|
57
|
-
kw = {'body': task_dict}
|
|
53
|
+
kw = {'body': result[1]}
|
|
58
54
|
self._submit_task(kw)
|
|
59
55
|
|
|
60
56
|
def _confirm_consume(self, kw):
|
|
@@ -32,9 +32,7 @@ class RedisConsumerAckAble000(ConsumerConfirmMixinWithTheHelpOfRedis, AbstractCo
|
|
|
32
32
|
# 如果运行了第20行,但没运行下面这一行,仍然有极小概率会丢失1个任务。但比不做控制随意关停,丢失几百个线程你的redis任务强多了。
|
|
33
33
|
self._add_task_str_to_unack_zset(task_str, )
|
|
34
34
|
# self.logger.debug(f'从redis的 [{self._queue_name}] 队列中 取出的消息是: {task_str} ')
|
|
35
|
-
|
|
36
|
-
task_dict = json.loads(task_str)
|
|
37
|
-
kw = {'body': task_dict, 'task_str': task_str}
|
|
35
|
+
kw = {'body': task_str, 'task_str': task_str}
|
|
38
36
|
self._submit_task(kw)
|
|
39
37
|
|
|
40
38
|
def _requeue(self, kw):
|
|
@@ -74,8 +72,7 @@ class RedisConsumerAckAble111(ConsumerConfirmMixinWithTheHelpOfRedis, AbstractCo
|
|
|
74
72
|
if return_v:
|
|
75
73
|
task_str = return_v
|
|
76
74
|
self.logger.debug(f'从redis的 [{self._queue_name}] 队列中 取出的消息是: {task_str} ')
|
|
77
|
-
|
|
78
|
-
kw = {'body': task_dict, 'task_str': task_str}
|
|
75
|
+
kw = {'body': task_str, 'task_str': task_str}
|
|
79
76
|
self._submit_task(kw)
|
|
80
77
|
else:
|
|
81
78
|
# print('xiuxi')
|
|
@@ -118,8 +115,7 @@ class RedisConsumerAckAble(ConsumerConfirmMixinWithTheHelpOfRedisByHearbeat, Abs
|
|
|
118
115
|
if return_v:
|
|
119
116
|
task_str = return_v
|
|
120
117
|
self.logger.debug(f'从redis的 [{self._queue_name}] 队列中 取出的消息是: {task_str} ')
|
|
121
|
-
|
|
122
|
-
kw = {'body': task_dict, 'task_str': task_str}
|
|
118
|
+
kw = {'body': task_str, 'task_str': task_str}
|
|
123
119
|
self._submit_task(kw)
|
|
124
120
|
else:
|
|
125
121
|
# print('xiuxi')
|
|
@@ -149,11 +145,10 @@ class RedisConsumerAckAble(ConsumerConfirmMixinWithTheHelpOfRedisByHearbeat, Abs
|
|
|
149
145
|
while True:
|
|
150
146
|
task_str_list = script(keys=[self._queue_name, self._unack_zset_name], args=[time.time()])
|
|
151
147
|
if task_str_list:
|
|
152
|
-
self._print_message_get_from_broker(
|
|
148
|
+
self._print_message_get_from_broker( task_str_list)
|
|
153
149
|
# self.logger.debug(f'从redis的 [{self._queue_name}] 队列中 取出的消息是: {task_str_list} ')
|
|
154
150
|
for task_str in task_str_list:
|
|
155
|
-
|
|
156
|
-
kw = {'body': task_dict, 'task_str': task_str}
|
|
151
|
+
kw = {'body': task_str, 'task_str': task_str}
|
|
157
152
|
self._submit_task(kw)
|
|
158
153
|
else:
|
|
159
154
|
time.sleep(0.2)
|
|
@@ -60,11 +60,9 @@ class RedisPriorityConsumer(RedisConsumerAckAble):
|
|
|
60
60
|
if task_tuple:
|
|
61
61
|
msg = task_tuple[1]
|
|
62
62
|
self.redis_db_frame.zadd(self._unack_zset_name, {msg: time.time()})
|
|
63
|
-
self.logger.debug(task_tuple)
|
|
64
|
-
self._print_message_get_from_broker('redis', msg)
|
|
63
|
+
# self.logger.debug(task_tuple)
|
|
65
64
|
# self.logger.debug(f'从redis的 [{self._queue_name}] 队列中 取出的消息是: {task_str_list} ')
|
|
66
|
-
|
|
67
|
-
kw = {'body': task_dict, 'task_str': msg}
|
|
65
|
+
kw = {'body': msg, 'task_str': msg}
|
|
68
66
|
self._submit_task(kw)
|
|
69
67
|
|
|
70
68
|
def _shedual_task(self):
|
|
@@ -87,10 +85,8 @@ class RedisPriorityConsumer(RedisConsumerAckAble):
|
|
|
87
85
|
except redis5.WatchError:
|
|
88
86
|
continue
|
|
89
87
|
if task_tuple:
|
|
90
|
-
self._print_message_get_from_broker('redis', msg)
|
|
91
88
|
# self.logger.debug(f'从redis的 [{self._queue_name}] 队列中 取出的消息是: {task_str_list} ')
|
|
92
|
-
|
|
93
|
-
kw = {'body': task_dict, 'task_str': msg}
|
|
89
|
+
kw = {'body': msg, 'task_str': msg}
|
|
94
90
|
self._submit_task(kw)
|
|
95
91
|
|
|
96
92
|
def _requeue(self, kw):
|
|
@@ -17,9 +17,8 @@ class RedisConsumer(AbstractConsumer, RedisMixin):
|
|
|
17
17
|
while True:
|
|
18
18
|
result = self.redis_db_frame.blpop(self._queue_name,timeout=60)
|
|
19
19
|
if result:
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
kw = {'body': task_dict}
|
|
20
|
+
|
|
21
|
+
kw = {'body': result[1]}
|
|
23
22
|
self._submit_task(kw)
|
|
24
23
|
|
|
25
24
|
def _confirm_consume(self, kw):
|
|
@@ -18,8 +18,8 @@ class RedisPbSubConsumer(AbstractConsumer, RedisMixin):
|
|
|
18
18
|
pub.subscribe(self.queue_name)
|
|
19
19
|
for item in pub.listen():
|
|
20
20
|
if item['type'] == 'message':
|
|
21
|
-
|
|
22
|
-
kw = {'body':
|
|
21
|
+
|
|
22
|
+
kw = {'body': item['data']}
|
|
23
23
|
self._submit_task(kw)
|
|
24
24
|
|
|
25
25
|
def _shedual_task(self):
|
|
@@ -29,7 +29,7 @@ class RedisPbSubConsumer(AbstractConsumer, RedisMixin):
|
|
|
29
29
|
while True: # 无限循环
|
|
30
30
|
msg_list = pub.parse_response(timeout=60) # 得到消息内容
|
|
31
31
|
if msg_list:
|
|
32
|
-
kw = {'body':
|
|
32
|
+
kw = {'body': msg_list[2]}
|
|
33
33
|
self._submit_task(kw)
|
|
34
34
|
|
|
35
35
|
|
|
@@ -44,10 +44,10 @@ class RedisStreamConsumer(AbstractConsumer, RedisMixin):
|
|
|
44
44
|
{self.queue_name: ">"}, count=100, block=60 * 1000)
|
|
45
45
|
if results:
|
|
46
46
|
# self.logger.debug(f'从redis的 [{self._queue_name}] stream 中 取出的消息是: {results} ')
|
|
47
|
-
self._print_message_get_from_broker(
|
|
47
|
+
self._print_message_get_from_broker( results)
|
|
48
48
|
# print(results[0][1])
|
|
49
49
|
for msg_id, msg in results[0][1]:
|
|
50
|
-
kw = {'body':
|
|
50
|
+
kw = {'body': msg[''], 'msg_id': msg_id}
|
|
51
51
|
self._submit_task(kw)
|
|
52
52
|
|
|
53
53
|
def _confirm_consume(self, kw):
|
|
@@ -91,5 +91,5 @@ class RedisStreamConsumer(AbstractConsumer, RedisMixin):
|
|
|
91
91
|
self.logger.warning(f' {self._queue_name} 的分组 {self.group} 的消费者 {self.consumer_identification} 夺取 断开的消费者 {xinfo_item["name"]}'
|
|
92
92
|
f' {len(xclaim_task_list)} 个任务,详细是 {xclaim_task_list} ')
|
|
93
93
|
for task in xclaim_task_list:
|
|
94
|
-
kw = {'body':
|
|
94
|
+
kw = {'body': task[1][''], 'msg_id': task[0]}
|
|
95
95
|
self._submit_task(kw)
|
|
@@ -31,8 +31,8 @@ class RocketmqConsumer(AbstractConsumer):
|
|
|
31
31
|
|
|
32
32
|
def callback(rocketmq_msg):
|
|
33
33
|
# self.logger.debug(f'从rocketmq的 [{self._queue_name}] 主题的queue_id {rocketmq_msg.queue_id} 中 取出的消息是:{rocketmq_msg.body}')
|
|
34
|
-
|
|
35
|
-
kw = {'body':
|
|
34
|
+
|
|
35
|
+
kw = {'body': rocketmq_msg.body, 'rocketmq_msg': rocketmq_msg}
|
|
36
36
|
self._submit_task(kw)
|
|
37
37
|
|
|
38
38
|
consumer.subscribe(self._queue_name, callback)
|
|
@@ -20,7 +20,7 @@ class SqlachemyConsumer(AbstractConsumer):
|
|
|
20
20
|
sqla_task_dict = self.queue.get()
|
|
21
21
|
# self.logger.debug(f'从数据库 {frame_config.SQLACHEMY_ENGINE_URL[:25]}。。 的 [{self._queue_name}] 队列中 取出的消息是: 消息是: {sqla_task_dict}')
|
|
22
22
|
self._print_message_get_from_broker(f'从数据库 {BrokerConnConfig.SQLACHEMY_ENGINE_URL[:25]}', sqla_task_dict)
|
|
23
|
-
kw = {'body':
|
|
23
|
+
kw = {'body': sqla_task_dict['body'], 'sqla_task_dict': sqla_task_dict}
|
|
24
24
|
self._submit_task(kw)
|
|
25
25
|
|
|
26
26
|
def _confirm_consume(self, kw):
|
|
@@ -42,10 +42,10 @@ class TCPConsumer(AbstractConsumer, ):
|
|
|
42
42
|
# print('server收到的数据', data)
|
|
43
43
|
if not data:
|
|
44
44
|
break
|
|
45
|
-
self._print_message_get_from_broker(f'udp {self._ip_port_raw}', data.decode())
|
|
45
|
+
# self._print_message_get_from_broker(f'udp {self._ip_port_raw}', data.decode())
|
|
46
46
|
tcp_cli_sock.send('has_recived'.encode())
|
|
47
47
|
# tcp_cli_sock.close()
|
|
48
|
-
kw = {'body':
|
|
48
|
+
kw = {'body': data}
|
|
49
49
|
self._submit_task(kw)
|
|
50
50
|
tcp_cli_sock.close()
|
|
51
51
|
except ConnectionResetError:
|
|
@@ -22,8 +22,8 @@ class TxtFileConsumer(AbstractConsumer, ):
|
|
|
22
22
|
while True:
|
|
23
23
|
with file_lock:
|
|
24
24
|
item = queue.get()
|
|
25
|
-
|
|
26
|
-
kw = {'body':
|
|
25
|
+
|
|
26
|
+
kw = {'body': item, 'q': queue, 'item': item}
|
|
27
27
|
self._submit_task(kw)
|
|
28
28
|
|
|
29
29
|
def _confirm_consume(self, kw):
|