Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

193 lines
7.8KB

  1. from celery_app import celery_app
  2. from fastapi import Request,FastAPI
  3. import time
  4. from services.redis_service import RedisService
  5. from services.kafka_service import KafkaService
  6. from services.gewe_service import GeWeService
  7. from common.log import logger
  8. import asyncio
  9. @celery_app.task(name='tasks.add_task', bind=True, acks_late=True)
  10. def add_task(self, x, y):
  11. time.sleep(5) # 模拟长时间计算
  12. logger.info('add')
  13. return x + y
  14. @celery_app.task(name='tasks.mul_task', bind=True, acks_late=True)
  15. def mul_task(self, x, y):
  16. time.sleep(5) # 模拟长时间计算
  17. return x * y
  18. # @celery.task(name='app.tasks.sync_contacts', bind=True, acks_late=True)
  19. # async def sync_contacts_task(self,app):
  20. # login_keys = list(await app.state.redis_service.client.scan_iter(match='__AI_OPS_WX__:LOGININFO:*'))
  21. # return login_keys
  22. # # for k in login_keys:
  23. # # print(k)
  24. @celery_app.task(name='tasks.sync_contacts', bind=True, acks_late=True)
  25. async def sync_contacts_task(self, redis_service):
  26. # Use the redis_service passed as an argument
  27. login_keys = list(await redis_service.client.scan_iter(match='__AI_OPS_WX__:LOGININFO:*'))
  28. return login_keys
  29. @celery_app.task(name='tasks.background_worker_task', bind=True, acks_late=True)
  30. def background_worker_task(self, redis_config, kafka_config, gewe_config):
  31. async def task():
  32. redis_service = RedisService()
  33. await redis_service.init(**redis_config)
  34. login_keys = []
  35. async for key in redis_service.client.scan_iter(match='__AI_OPS_WX__:LOGININFO:*'):
  36. login_keys.append(key)
  37. print(login_keys)
  38. asyncio.run(task())
  39. # @celery.task(name='tasks.background_worker_task', bind=True, acks_late=True)
  40. # async def background_worker_task(self, redis_config, kafka_config, gewe_config):
  41. # # Initialize services inside the task
  42. # redis_service = RedisService()
  43. # await redis_service.init(**redis_config)
  44. # login_keys = []
  45. # async for key in redis_service.client.scan_iter(match='__AI_OPS_WX__:LOGININFO:*'): # 使用 async for 遍历异步生成器
  46. # login_keys.append(key)
  47. # print(login_keys)
  48. # kafka_service = KafkaService(**kafka_config)
  49. # await kafka_service.start()
  50. # gewe_service = await GeWeService.get_instance(None, gewe_config['api_url'])
  51. # # Task logic
  52. # lock_name = "background_wxchat_thread_lock"
  53. # lock_identifier = str(time.time())
  54. # while True:
  55. # if await redis_service.acquire_lock(lock_name, timeout=10):
  56. # try:
  57. # logger.info("分布式锁已成功获取")
  58. # # Perform task logic
  59. # finally:
  60. # await redis_service.release_lock(lock_name, lock_identifier)
  61. # break
  62. # else:
  63. # logger.info("获取分布式锁失败,等待10秒后重试...")
  64. # await asyncio.sleep(10)
  65. # @celery_app.task(name='tasks.scheduled_task', bind=True, acks_late=True)
  66. # def scheduled_task(self):
  67. # print("定时任务执行成功!~~~~~~~~~~~~~~~~~")
  68. # return "Hello from Celery Beat + RedBeat!"
  69. # @celery_app.task(name='tasks.scheduled_task_sync_wx', bind=True, acks_late=True)
  70. # def scheduled_task_sync_wx(self,redis_service,kafka_service,gewe_service):
  71. # print("scheduled_task_sync_wx 定时任务执行成功!")
  72. # return "Hello from Celery Beat + RedBeat!"
  73. # @celery_app.task(name='tasks.scheduled_task_sync_wx_info_1', bind=True, acks_late=True)
  74. # def scheduled_task_sync_wx_info_1(self,redis_config, kafka_config, gewe_config):
  75. # '''
  76. # 定时获取微信号资料
  77. # '''
  78. # loop = asyncio.new_event_loop()
  79. # asyncio.set_event_loop(loop)
  80. # async def task():
  81. # try:
  82. # redis_service = RedisService()
  83. # await redis_service.init(**redis_config)
  84. # # gewe_service = await GeWeService.get_instance(None, gewe_config['api_url'])
  85. # login_keys = []
  86. # async for key in redis_service.client.scan_iter(match='__AI_OPS_WX__:LOGININFO:*'):
  87. # login_keys.append(key)
  88. # print(login_keys)
  89. # # for k in login_keys:
  90. # # r = await redis_service.get_hash(k)
  91. # # app_id = r.get("appId")
  92. # # token_id = r.get("tokenId")
  93. # # wxid = r.get("wxid")
  94. # # status = r.get('status')
  95. # # if status == '0':
  96. # # continue
  97. # # ret, msg, profile = await gewe_service.get_profile_async(token_id, app_id)
  98. # # if ret != 200:
  99. # # logger.warning(f"同步微信号 {wxid} 资料失败: {ret}-{msg}")
  100. # # continue
  101. # # nickname=profile.get("nickName")
  102. # # head_img_url=profile.get("smallHeadImgUrl")
  103. # # r.update({"nickName":nickname,"headImgUrl":head_img_url,"modify_at":int(time.time())})
  104. # # cleaned_login_info = {k: (v if v is not None else '') for k, v in r.items()}
  105. # # await redis_service.set_hash(k, cleaned_login_info)
  106. # # logger.info(f"同步微信号 {wxid} 资料 成功")
  107. # # redis_service.update_hash_field(k,"nickName",nickname)
  108. # # redis_service.update_hash_field(k,"headImgUrl",head_img_url)
  109. # # redis_service.update_hash_field(k,"modify_at",int(time.time()))
  110. # except Exception as e:
  111. # logger.error(f"任务执行过程中发生异常: {e}")
  112. # print("scheduled_task_sync_wx_info 定时任务执行成功!")
  113. # return "Hello from Celery Beat + RedBeat!"
  114. # loop.run_until_complete(task())
  115. # loop.close()
  116. @celery_app.task(name='tasks.scheduled_task_sync_wx_info', bind=True, acks_late=True)
  117. def scheduled_task_sync_wx_info(self, redis_config, kafka_config, gewe_config):
  118. '''
  119. 定时获取微信号资料
  120. '''
  121. async def task():
  122. try:
  123. redis_service = RedisService()
  124. await redis_service.init(**redis_config)
  125. gewe_service = await GeWeService.get_instance(redis_service,gewe_config['api_url'])
  126. login_keys = []
  127. async for key in redis_service.client.scan_iter(match='__AI_OPS_WX__:LOGININFO:*'):
  128. login_keys.append(key)
  129. print(login_keys)
  130. for k in login_keys:
  131. r = await redis_service.get_hash(k)
  132. app_id = r.get("appId")
  133. token_id = r.get("tokenId")
  134. wxid = r.get("wxid")
  135. status = r.get('status')
  136. if status == '0':
  137. logger.warning(f"微信号 {wxid} 已经离线: {ret}-{msg}")
  138. continue
  139. ret, msg, profile = await gewe_service.get_profile_async(token_id, app_id)
  140. if ret != 200:
  141. logger.warning(f"同步微信号 {wxid} 资料失败: {ret}-{msg}")
  142. continue
  143. nickname=profile.get("nickName")
  144. head_img_url=profile.get("smallHeadImgUrl")
  145. # print(nickname)
  146. nickname=profile.get("nickName")
  147. head_img_url=profile.get("smallHeadImgUrl")
  148. r.update({"nickName":nickname,"headImgUrl":head_img_url,"modify_at":int(time.time())})
  149. cleaned_login_info = {k: (v if v is not None else '') for k, v in r.items()}
  150. await redis_service.set_hash(k, cleaned_login_info)
  151. logger.info(f"定时同步微信号{wxid}-昵称{nickname} 资料成功")
  152. except Exception as e:
  153. logger.error(f"任务执行过程中发生异常: {e}")
  154. loop = asyncio.get_event_loop()
  155. if loop.is_closed():
  156. loop = asyncio.new_event_loop()
  157. asyncio.set_event_loop(loop)
  158. loop.run_until_complete(task()) # 在现有事件循环中运行任务