config_test.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562
  1. # -*- coding: utf-8 -*-
  2. #!/usr/bin/env python
  3. """
  4. celery的配置文件
  5. apps.tasks.config
  6. ~~~~~~~~~~~~~~~~~
  7. """
  8. import os
  9. from os.path import join, abspath
  10. from django.conf import settings
  11. from dotenv import get_key, load_dotenv
  12. from celery.schedules import crontab
  13. base_dir = os.path.abspath(os.path.split(os.path.realpath(__file__))[0] + "/..")
  14. task_dir = join(base_dir, 'taskmanager')
  15. dotenv_path = abspath(join(base_dir, '.env.%s' % os.environ.get('MY_ENV')))
  16. load_dotenv(dotenv_path)
  17. env = lambda key: get_key(dotenv_path, key)
  18. # ========== broker settings ===========
  19. #: broker url
  20. BROKER_URL = env('CELERY_BROKER_URL')
  21. # : 指定接受的内容类型
  22. CELERY_ACCEPT_CONTENT = ['json', 'msgpack']
  23. # BROKER_POOL_LIMIT = 10
  24. # CONNECTION RETRY仅对WORKER生效, 对PUBLISH不生效
  25. # BROKER_CONNECTION_TIMEOUT = 4
  26. # BROKER_CONNECTION_RETRY = True
  27. # BROKER_CONNECTION_MAX_RETRIES = 100
  28. #BROKER_TRANSPORT_OPTIONS
  29. # ========== celery settings ===========
  30. MY_CELERY_QUEUE = settings.MY_CELERY_QUEUE
  31. MY_CELERY_ROUTING_KEY = settings.MY_CELERY_ROUTING_KEY
  32. POLL_RECHARGE_RECORD_QUEUE = 'poll_recharge_record'
  33. POLL_RECHARGE_RECORD_QUEUE_KEY = 'poll_recharge_record'
  34. DEALER_DATA_ANYLYSE_QUEUE = 'dealer_data_anylyse'
  35. DEALER_DATA_ANYLYSE_QUEUE_KEY = 'dealer_data_anylyse'
  36. # 设备离线的延时任务 安全起见这个地方仅仅区里发送任务的通知 不要访问数据库 作为独立的单元处理
  37. DEVICE_OFFLINE_QUEUE = "device_offline"
  38. DEVICE_OFFLINE_QUEUE_KEY = "device_offline"
  39. OFFLINE_TASK_QUEUE = 'offline_task'
  40. OFFLINE_TASK_QUEUE_KEY = 'offline_task'
  41. REPORT_TASK_QUEUE = 'report_task'
  42. REPORT_TASK_QUEUE_KEY = 'report_task'
  43. CELERY_QUEUES = {
  44. MY_CELERY_ROUTING_KEY: {
  45. 'exchange': MY_CELERY_QUEUE,
  46. 'exchange_type': 'direct',
  47. 'binding_key': MY_CELERY_ROUTING_KEY
  48. },
  49. POLL_RECHARGE_RECORD_QUEUE: {
  50. 'exchange': POLL_RECHARGE_RECORD_QUEUE,
  51. 'exchange_type': 'direct',
  52. 'binding_key': POLL_RECHARGE_RECORD_QUEUE_KEY
  53. },
  54. DEALER_DATA_ANYLYSE_QUEUE: {
  55. 'exchange': DEALER_DATA_ANYLYSE_QUEUE,
  56. 'exchange_type': 'direct',
  57. 'binding_key': DEALER_DATA_ANYLYSE_QUEUE_KEY
  58. },
  59. DEVICE_OFFLINE_QUEUE: {
  60. 'exchange': DEVICE_OFFLINE_QUEUE,
  61. 'exchange_type': 'direct',
  62. 'binding_key': DEVICE_OFFLINE_QUEUE_KEY
  63. },
  64. OFFLINE_TASK_QUEUE: {
  65. 'exchange': OFFLINE_TASK_QUEUE,
  66. 'exchange_type': 'direct',
  67. 'binding_key': OFFLINE_TASK_QUEUE_KEY
  68. },
  69. REPORT_TASK_QUEUE: {
  70. 'exchange': REPORT_TASK_QUEUE,
  71. 'exchange_type': 'direct',
  72. 'binding_key': REPORT_TASK_QUEUE_KEY
  73. }
  74. }
  75. CELERY_ROUTES = {
  76. 'tasks.device_offline_notify': {
  77. 'queue': DEVICE_OFFLINE_QUEUE,
  78. 'routing_key': DEVICE_OFFLINE_QUEUE_KEY
  79. },
  80. 'tasks.report_new_payment_to_dealer_via_wechat': {
  81. 'queue': MY_CELERY_QUEUE,
  82. 'routing_key': MY_CELERY_ROUTING_KEY
  83. },
  84. 'tasks.report_service_complete_to_user_via_wechat': {
  85. 'queue': MY_CELERY_QUEUE,
  86. 'routing_key': MY_CELERY_ROUTING_KEY
  87. },
  88. 'tasks.add': {
  89. 'queue': MY_CELERY_QUEUE,
  90. 'routing_key': MY_CELERY_ROUTING_KEY
  91. },
  92. 'tasks.report_to_user_via_wechat': {
  93. 'queue': MY_CELERY_QUEUE,
  94. 'routing_key': MY_CELERY_ROUTING_KEY
  95. },
  96. 'tasks.send_msg_to_user_via_wechat': {
  97. 'queue': MY_CELERY_QUEUE,
  98. 'routing_key': MY_CELERY_ROUTING_KEY
  99. },
  100. 'tasks.report_to_dealer_via_wechat': {
  101. 'queue': MY_CELERY_QUEUE,
  102. 'routing_key': MY_CELERY_ROUTING_KEY
  103. },
  104. 'tasks.report_feedback_to_dealer_via_wechat': {
  105. 'queue': MY_CELERY_QUEUE,
  106. 'routing_key': MY_CELERY_ROUTING_KEY
  107. },
  108. 'tasks.send_topic_command': {
  109. 'queue': MY_CELERY_QUEUE,
  110. 'routing_key': MY_CELERY_ROUTING_KEY
  111. },
  112. 'tasks.send_to_xf_falut': {
  113. 'queue': MY_CELERY_QUEUE,
  114. 'routing_key': MY_CELERY_ROUTING_KEY
  115. },
  116. 'tasks.send_to_xf_falut_handle': {
  117. 'queue': MY_CELERY_QUEUE,
  118. 'routing_key': MY_CELERY_ROUTING_KEY
  119. },
  120. 'tasks.generate_simCharge_excel_report': {
  121. 'queue': REPORT_TASK_QUEUE,
  122. 'routing_key': REPORT_TASK_QUEUE_KEY
  123. },
  124. 'tasks.generate_dealerWithDraw_excel_report': {
  125. 'queue': REPORT_TASK_QUEUE,
  126. 'routing_key': REPORT_TASK_QUEUE_KEY
  127. },
  128. 'tasks.generate_biz_stats_for_manager': {
  129. 'queue': REPORT_TASK_QUEUE,
  130. 'routing_key': REPORT_TASK_QUEUE_KEY
  131. },
  132. 'tasks.generate_business_stats_report_by_dealer': {
  133. 'queue': REPORT_TASK_QUEUE,
  134. 'routing_key': REPORT_TASK_QUEUE_KEY
  135. },
  136. 'tasks.export_charge_order_excel_from_db': {
  137. 'queue': REPORT_TASK_QUEUE,
  138. 'routing_key': REPORT_TASK_QUEUE_KEY
  139. },
  140. 'tasks.export_consume_order_excel_from_db': {
  141. 'queue': REPORT_TASK_QUEUE,
  142. 'routing_key': REPORT_TASK_QUEUE_KEY
  143. },
  144. 'tasks.export_send_coins_to_card_order_excel_from_db': {
  145. 'queue': REPORT_TASK_QUEUE,
  146. 'routing_key': REPORT_TASK_QUEUE_KEY
  147. },
  148. 'tasks.export_on_points_order_excel_from_db': {
  149. 'queue': REPORT_TASK_QUEUE,
  150. 'routing_key': REPORT_TASK_QUEUE_KEY
  151. },
  152. 'tasks.export_API_order_excel_from_db': {
  153. 'queue': REPORT_TASK_QUEUE,
  154. 'routing_key': REPORT_TASK_QUEUE_KEY
  155. },
  156. 'tasks.export_group_stat_excel_from_db': {
  157. 'queue': REPORT_TASK_QUEUE,
  158. 'routing_key': REPORT_TASK_QUEUE_KEY
  159. },
  160. 'tasks.export_vcard_info_excel_from_db': {
  161. 'queue': REPORT_TASK_QUEUE,
  162. 'routing_key': REPORT_TASK_QUEUE_KEY
  163. },
  164. 'tasks.export_aggregate_dealer_income': {
  165. 'queue': REPORT_TASK_QUEUE,
  166. 'routing_key': REPORT_TASK_QUEUE_KEY
  167. },
  168. 'tasks.import_simcard_excel_to_db': {
  169. 'queue': OFFLINE_TASK_QUEUE,
  170. 'routing_key': OFFLINE_TASK_QUEUE_KEY
  171. },
  172. 'tasks.export_simcard_excel_from_db': {
  173. 'queue': OFFLINE_TASK_QUEUE,
  174. 'routing_key': OFFLINE_TASK_QUEUE_KEY
  175. },
  176. 'tasks.export_device_excel_from_db': {
  177. 'queue': REPORT_TASK_QUEUE,
  178. 'routing_key': REPORT_TASK_QUEUE_KEY
  179. },
  180. 'tasks.poll_dealer_recharge_record': {
  181. 'queue': POLL_RECHARGE_RECORD_QUEUE,
  182. 'routing_key': POLL_RECHARGE_RECORD_QUEUE_KEY
  183. },
  184. 'tasks.poll_user_recharge_record': {
  185. 'queue': POLL_RECHARGE_RECORD_QUEUE,
  186. 'routing_key': POLL_RECHARGE_RECORD_QUEUE_KEY
  187. },
  188. 'tasks.test_sync': {
  189. 'queue': POLL_RECHARGE_RECORD_QUEUE,
  190. 'routing_key': POLL_RECHARGE_RECORD_QUEUE_KEY
  191. },
  192. 'tasks.manager_export_charge_order_excel_from_db': {
  193. 'queue': REPORT_TASK_QUEUE,
  194. 'routing_key': REPORT_TASK_QUEUE_KEY
  195. },
  196. 'tasks.manager_export_dealer_info_excel_from_db': {
  197. 'queue': REPORT_TASK_QUEUE,
  198. 'routing_key': REPORT_TASK_QUEUE_KEY
  199. },
  200. 'tasks.manager_export_consume_order_excel_from_db': {
  201. 'queue': REPORT_TASK_QUEUE,
  202. 'routing_key': REPORT_TASK_QUEUE_KEY
  203. },
  204. 'tasks.batch_set_device_params': {
  205. 'queue': OFFLINE_TASK_QUEUE,
  206. 'routing_key': OFFLINE_TASK_QUEUE_KEY
  207. },
  208. 'tasks.set_device_params': {
  209. 'queue': OFFLINE_TASK_QUEUE,
  210. 'routing_key': OFFLINE_TASK_QUEUE_KEY
  211. },
  212. 'tasks.batch_set_server_settings': {
  213. 'queue': OFFLINE_TASK_QUEUE,
  214. 'routing_key': OFFLINE_TASK_QUEUE_KEY
  215. },
  216. 'tasks.set_server_settings': {
  217. 'queue': OFFLINE_TASK_QUEUE,
  218. 'routing_key': OFFLINE_TASK_QUEUE_KEY
  219. },
  220. }
  221. # TODO zjl如果一个任务没有在visibility_timeout内被确认 则会将此任务分发给另一个worker执行
  222. # TODO zjl那么当延时任务的countdown时间长度超过此 时间的时候,有可能会造成多个worker共同执行同一个任务
  223. # TODO zjl使用redis作为消息队列的时候,此值的默认 是 3600s ,目前并没有超过这个时间的延时任务,暂时注释,需要的时候打开
  224. # BROKER_TRANSPORT_OPTIONS = {
  225. # 'visibility_timeout': 10
  226. # }
  227. CELERYBEAT_SCHEDULE = {
  228. 'report_daily_report_to_dealer_via_wechat': {
  229. 'task': 'tasks.report_daily_report_to_dealer_via_wechat',
  230. # : 每日9点运行
  231. 'schedule': crontab(minute = 0, hour = 9),
  232. # 'args': () ,
  233. 'options': {
  234. 'queue': MY_CELERY_QUEUE,
  235. 'routing_key': MY_CELERY_ROUTING_KEY
  236. }
  237. },
  238. 'weekly_notify_finance_manager': {
  239. 'task': 'tasks.weekly_notify_finance_manager',
  240. 'schedule': crontab(minute = 0, hour = 8, day_of_week = 'wed,fri'),
  241. 'options': {
  242. 'queue': MY_CELERY_QUEUE,
  243. 'routing_key': MY_CELERY_ROUTING_KEY
  244. }
  245. },
  246. 'remove_serviceProgress_periodically': {
  247. 'task': 'tasks.remove_serviceProgress_periodically',
  248. 'schedule': crontab(minute = 0, hour = 2),
  249. 'options': {
  250. 'queue': MY_CELERY_QUEUE,
  251. 'routing_key': MY_CELERY_ROUTING_KEY
  252. }
  253. },
  254. 'notify_virtual_card_expired': {
  255. 'task': 'tasks.notify_virtual_card_expired',
  256. 'schedule': crontab(minute = 0, hour = 15),
  257. 'options': {
  258. 'queue': MY_CELERY_QUEUE,
  259. 'routing_key': MY_CELERY_ROUTING_KEY
  260. }
  261. },
  262. # 'handle_customer_complaints_yesterday': {
  263. # 'task': 'tasks.handle_customer_complaints_yesterday',
  264. #
  265. # 'schedule': crontab(minute=0, hour=3),
  266. #
  267. # 'options': {
  268. # 'queue': MY_CELERY_QUEUE,
  269. # 'routing_key': MY_CELERY_ROUTING_KEY
  270. # }
  271. # },
  272. 'send_SIM_expired_messages_by_sms': {
  273. 'task': 'tasks.send_SIM_expired_messages',
  274. 'schedule': crontab(day_of_month = '1,6,11,19,23,25,26', minute = 0, hour = 10),
  275. 'options': {
  276. 'queue': MY_CELERY_QUEUE,
  277. 'routing_key': MY_CELERY_ROUTING_KEY
  278. },
  279. 'args': ('sms',)
  280. },
  281. 'send_SIM_expired_messages_by_wechat': {
  282. 'task': 'tasks.send_SIM_expired_messages',
  283. 'schedule': crontab(day_of_month = '1,6,11,19,23,25,26', minute = 0, hour = 20),
  284. 'options': {
  285. 'queue': MY_CELERY_QUEUE,
  286. 'routing_key': MY_CELERY_ROUTING_KEY
  287. },
  288. 'args': ('wechat',)
  289. },
  290. 'calc_dealer_stat_and_insert_into_db': {
  291. 'task': 'tasks.calc_dealer_stat_and_insert_into_db',
  292. 'schedule': crontab(minute = 10, hour = 00),
  293. 'options': {
  294. 'queue': DEALER_DATA_ANYLYSE_QUEUE,
  295. 'routing_key': DEALER_DATA_ANYLYSE_QUEUE_KEY
  296. }
  297. },
  298. 'calc_dealer_user_count': {
  299. 'task': 'tasks.calc_dealer_user_count',
  300. 'schedule': crontab(minute = 30, hour = 0, day_of_week = 'fri'),
  301. 'options': {
  302. 'queue': DEALER_DATA_ANYLYSE_QUEUE,
  303. 'routing_key': DEALER_DATA_ANYLYSE_QUEUE_KEY
  304. }
  305. },
  306. 'generate_manager_map_options': {
  307. 'task': 'tasks.generate_manager_map_options',
  308. 'schedule': crontab(minute = 0, hour = 1),
  309. 'options': {
  310. 'queue': MY_CELERY_QUEUE,
  311. 'routing_key': MY_CELERY_ROUTING_KEY
  312. }
  313. },
  314. 'check_withdraw_via_bank': {
  315. 'task': 'tasks.check_withdraw_via_bank',
  316. 'schedule': crontab(minute = 0, hour = 2),
  317. 'options': {
  318. 'queue': POLL_RECHARGE_RECORD_QUEUE,
  319. 'routing_key': POLL_RECHARGE_RECORD_QUEUE_KEY
  320. }
  321. },
  322. 'check_and_retry_withdraw': {
  323. 'task': 'tasks.check_and_retry_withdraw',
  324. 'schedule': crontab(minute = 0, hour = 4),
  325. 'options': {
  326. 'queue': POLL_RECHARGE_RECORD_QUEUE,
  327. 'routing_key': POLL_RECHARGE_RECORD_QUEUE_KEY
  328. }
  329. },
  330. "send_to_xf_all_dev_info": {
  331. "task": "tasks.send_to_xf_all_dev_info",
  332. "schedule": crontab(minute = 10, hour = 0),
  333. "options": {
  334. 'queue': MY_CELERY_QUEUE,
  335. 'routing_key': MY_CELERY_ROUTING_KEY
  336. }
  337. },
  338. # 租用设备相关的
  339. # 每日晚上凌晨2点生成订单
  340. "gen_daily_rent_order": {
  341. "task": "tasks.gen_daily_rent_order",
  342. "schedule": crontab(minute=0, hour=2),
  343. "options": {
  344. 'queue': MY_CELERY_QUEUE,
  345. 'routing_key': MY_CELERY_ROUTING_KEY
  346. }
  347. },
  348. # 每日下午3点进行订单扣款
  349. "deduct_rent_order": {
  350. "task": "tasks.deduct_rent_order",
  351. "schedule": crontab(minute=0, hour=15),
  352. "options": {
  353. 'queue': MY_CELERY_QUEUE,
  354. 'routing_key': MY_CELERY_ROUTING_KEY
  355. }
  356. },
  357. # 每天发送同步时间的消息。支持的是云快充协议的设备
  358. "sync_device_time_for_tcpcar": {
  359. "task": "tasks.sync_device_time_for_tcpcar",
  360. "schedule": crontab(minute=0, hour=16),
  361. "options": {
  362. 'queue': MY_CELERY_QUEUE,
  363. 'routing_key': MY_CELERY_ROUTING_KEY
  364. }
  365. },
  366. # 每天凌晨 1 点 对于退款订单进行一次拉取信息
  367. 'pull_refund_order': {
  368. 'task': 'tasks.pull_refund_order',
  369. 'schedule': crontab(minute=0, hour=1),
  370. 'options': {
  371. 'queue': MY_CELERY_QUEUE,
  372. 'routing_key': MY_CELERY_ROUTING_KEY
  373. }
  374. },
  375. # 浙江的消防局的消防
  376. 'report_to_zhejiang_fight': {
  377. 'task': 'tasks.report_to_zhejiang_fight',
  378. 'schedule': crontab(minute=0, hour=2),
  379. 'options': {
  380. 'queue': MY_CELERY_QUEUE,
  381. 'routing_key': MY_CELERY_ROUTING_KEY
  382. }
  383. },
  384. # 每天凌晨 2 点 运行一次经销商的自动提现
  385. 'dealer_auto_withdraw': {
  386. 'task': 'tasks.dealer_auto_withdraw',
  387. # 每个月1号执行任务
  388. 'schedule': crontab(minute=0, hour=2),
  389. 'options': {
  390. 'queue': MY_CELERY_QUEUE,
  391. 'routing_key': MY_CELERY_ROUTING_KEY
  392. }
  393. },
  394. 'sum_customer': {
  395. 'task': 'tasks.sum_customer',
  396. # 每个月1号执行任务
  397. 'schedule': crontab(minute = 0, hour = 0, day_of_month = 1),
  398. 'options': {
  399. 'queue': MY_CELERY_QUEUE,
  400. 'routing_key': MY_CELERY_ROUTING_KEY
  401. }
  402. },
  403. 'dealer_auto_charge_sim_card':{
  404. 'task': 'tasks.dealer_auto_charge_sim_card',
  405. 'schedule': crontab(day_of_month = '15', minute = 0, hour = 10),
  406. 'options': {
  407. 'queue': MY_CELERY_QUEUE,
  408. 'routing_key': MY_CELERY_ROUTING_KEY
  409. }
  410. },
  411. 'make_rpt_into_db': {
  412. 'task': 'tasks.make_rpt_into_db',
  413. 'schedule': crontab(minute = 30, hour = 2),
  414. 'options': {
  415. 'queue': MY_CELERY_QUEUE,
  416. 'routing_key': MY_CELERY_ROUTING_KEY
  417. }
  418. },
  419. }
  420. CELERY_ENABLE_UTC = True
  421. CELERY_TIMEZONE = "Asia/Shanghai"
  422. CELERY_IGNORE_RESULT = True
  423. # : 任务序列化和反序列化使用msgpack方案
  424. CELERY_TASK_SERIALIZER = 'msgpack'
  425. # : 读取任务结果一般性能要求不高,所以使用了可读性更好的JSON
  426. CELERY_RESULT_SERIALIZER = 'json'
  427. # Decides if publishing task messages will be retried in the case of connection loss or other connection errors
  428. CELERY_TASK_PUBLISH_RETRY = False
  429. # :每个worker处理的最大任务数量 超过任务数量直接销毁, 同时释放内存
  430. CELERYD_MAX_TASKS_PER_CHILD = 100
  431. # : 任务过期时间,不建议直接写86400,应该让这样的magic数字表述更明显
  432. CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24
  433. #: 结果储存
  434. CELERY_RESULT_BACKEND = env('CELERY_RESULT_BACKEND')
  435. CELERYD_LOG_FORMAT = '[%(asctime)s] %(levelname)s[%(processName)s] %(module)s [%(name)s:%(lineno)d]: %(message)s'
  436. CELERYD_TASK_LOG_FORMAT = '[%(asctime)s] %(levelname)s[%(processName)s] %(module)s [%(name)s:%(lineno)d]:' \
  437. ' [%(task_name)s(%(task_id)s)] %(message)s'