config_test.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573
  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. 'schedule': crontab(minute=0, hour=3),
  265. 'options': {
  266. 'queue': MY_CELERY_QUEUE,
  267. 'routing_key': MY_CELERY_ROUTING_KEY
  268. }
  269. },
  270. 'send_SIM_expired_messages_by_sms': {
  271. 'task': 'tasks.send_SIM_expired_messages',
  272. 'schedule': crontab(day_of_month = '1,6,11,19,23,25,26', minute = 0, hour = 10),
  273. 'options': {
  274. 'queue': MY_CELERY_QUEUE,
  275. 'routing_key': MY_CELERY_ROUTING_KEY
  276. },
  277. 'args': ('sms',)
  278. },
  279. 'send_SIM_expired_messages_by_wechat': {
  280. 'task': 'tasks.send_SIM_expired_messages',
  281. 'schedule': crontab(day_of_month = '1,6,11,19,23,25,26', minute = 0, hour = 20),
  282. 'options': {
  283. 'queue': MY_CELERY_QUEUE,
  284. 'routing_key': MY_CELERY_ROUTING_KEY
  285. },
  286. 'args': ('wechat',)
  287. },
  288. 'calc_dealer_stat_and_insert_into_db': {
  289. 'task': 'tasks.calc_dealer_stat_and_insert_into_db',
  290. 'schedule': crontab(minute = 10, hour = 00),
  291. 'options': {
  292. 'queue': DEALER_DATA_ANYLYSE_QUEUE,
  293. 'routing_key': DEALER_DATA_ANYLYSE_QUEUE_KEY
  294. }
  295. },
  296. 'calc_dealer_user_count': {
  297. 'task': 'tasks.calc_dealer_user_count',
  298. 'schedule': crontab(minute = 30, hour = 0, day_of_week = 'fri'),
  299. 'options': {
  300. 'queue': DEALER_DATA_ANYLYSE_QUEUE,
  301. 'routing_key': DEALER_DATA_ANYLYSE_QUEUE_KEY
  302. }
  303. },
  304. 'generate_manager_map_options': {
  305. 'task': 'tasks.generate_manager_map_options',
  306. 'schedule': crontab(minute = 0, hour = 1),
  307. 'options': {
  308. 'queue': MY_CELERY_QUEUE,
  309. 'routing_key': MY_CELERY_ROUTING_KEY
  310. }
  311. },
  312. 'check_wechat_withdraw_via_bank': {
  313. 'task': 'tasks.check_wechat_withdraw_via_bank',
  314. 'schedule': crontab(minute = 0, hour = 2),
  315. 'options': {
  316. 'queue': POLL_RECHARGE_RECORD_QUEUE,
  317. 'routing_key': POLL_RECHARGE_RECORD_QUEUE_KEY
  318. }
  319. },
  320. 'check_and_retry_withdraw': {
  321. 'task': 'tasks.check_and_retry_withdraw',
  322. 'schedule': crontab(minute = 0, hour = 4),
  323. 'options': {
  324. 'queue': POLL_RECHARGE_RECORD_QUEUE,
  325. 'routing_key': POLL_RECHARGE_RECORD_QUEUE_KEY
  326. }
  327. },
  328. "send_to_xf_all_dev_info": {
  329. "task": "tasks.send_to_xf_all_dev_info",
  330. "schedule": crontab(minute = 10, hour = 0),
  331. "options": {
  332. 'queue': MY_CELERY_QUEUE,
  333. 'routing_key': MY_CELERY_ROUTING_KEY
  334. }
  335. },
  336. # 租用设备相关的
  337. # 每日晚上凌晨2点生成订单
  338. "gen_daily_rent_order": {
  339. "task": "tasks.gen_daily_rent_order",
  340. "schedule": crontab(minute=0, hour=2),
  341. "options": {
  342. 'queue': MY_CELERY_QUEUE,
  343. 'routing_key': MY_CELERY_ROUTING_KEY
  344. }
  345. },
  346. # 每日下午3点进行订单扣款
  347. "deduct_rent_order": {
  348. "task": "tasks.deduct_rent_order",
  349. "schedule": crontab(minute=0, hour=15),
  350. "options": {
  351. 'queue': MY_CELERY_QUEUE,
  352. 'routing_key': MY_CELERY_ROUTING_KEY
  353. }
  354. },
  355. # 每天发送同步时间的消息。支持的是云快充协议的设备
  356. "sync_device_time_for_tcpcar": {
  357. "task": "tasks.sync_device_time_for_tcpcar",
  358. "schedule": crontab(minute=0, hour=16),
  359. "options": {
  360. 'queue': MY_CELERY_QUEUE,
  361. 'routing_key': MY_CELERY_ROUTING_KEY
  362. }
  363. },
  364. # 每天凌晨 1 点 对于退款订单进行一次拉取信息
  365. 'pull_refund_order': {
  366. 'task': 'tasks.pull_refund_order',
  367. 'schedule': crontab(minute=0, hour=1),
  368. 'options': {
  369. 'queue': MY_CELERY_QUEUE,
  370. 'routing_key': MY_CELERY_ROUTING_KEY
  371. }
  372. },
  373. # 浙江的消防局的消防
  374. 'report_to_zhejiang_fight': {
  375. 'task': 'tasks.report_to_zhejiang_fight',
  376. 'schedule': crontab(minute=0, hour=2),
  377. 'options': {
  378. 'queue': MY_CELERY_QUEUE,
  379. 'routing_key': MY_CELERY_ROUTING_KEY
  380. }
  381. },
  382. # 每天凌晨 2 点 运行一次经销商的自动提现
  383. 'dealer_auto_withdraw': {
  384. 'task': 'tasks.dealer_auto_withdraw',
  385. # 每个月1号执行任务
  386. 'schedule': crontab(minute=0, hour=2),
  387. 'options': {
  388. 'queue': MY_CELERY_QUEUE,
  389. 'routing_key': MY_CELERY_ROUTING_KEY
  390. }
  391. },
  392. 'sum_customer': {
  393. 'task': 'tasks.sum_customer',
  394. # 每个月1号执行任务
  395. 'schedule': crontab(minute = 0, hour = 0, day_of_month = 1),
  396. 'options': {
  397. 'queue': MY_CELERY_QUEUE,
  398. 'routing_key': MY_CELERY_ROUTING_KEY
  399. }
  400. },
  401. 'query_merchant_status': {
  402. 'task': 'tasks.query_merchant_status',
  403. 'schedule': crontab(minute=0, hour=3),
  404. 'options': {
  405. 'queue': MY_CELERY_QUEUE,
  406. 'routing_key': MY_CELERY_ROUTING_KEY
  407. }
  408. },
  409. 'dealer_auto_charge_sim_card':{
  410. 'task': 'tasks.dealer_auto_charge_sim_card',
  411. 'schedule': crontab(day_of_month = '15', minute = 0, hour = 10),
  412. 'options': {
  413. 'queue': MY_CELERY_QUEUE,
  414. 'routing_key': MY_CELERY_ROUTING_KEY
  415. }
  416. },
  417. 'make_rpt_into_db': {
  418. 'task': 'tasks.make_rpt_into_db',
  419. 'schedule': crontab(minute = 30, hour = 2),
  420. 'options': {
  421. 'queue': MY_CELERY_QUEUE,
  422. 'routing_key': MY_CELERY_ROUTING_KEY
  423. }
  424. },
  425. }
  426. CELERY_ENABLE_UTC = True
  427. CELERY_TIMEZONE = "Asia/Shanghai"
  428. CELERY_IGNORE_RESULT = True
  429. # : 任务序列化和反序列化使用msgpack方案
  430. CELERY_TASK_SERIALIZER = 'msgpack'
  431. # : 读取任务结果一般性能要求不高,所以使用了可读性更好的JSON
  432. CELERY_RESULT_SERIALIZER = 'json'
  433. # Decides if publishing task messages will be retried in the case of connection loss or other connection errors
  434. CELERY_TASK_PUBLISH_RETRY = False
  435. # :每个worker处理的最大任务数量 超过任务数量直接销毁, 同时释放内存
  436. CELERYD_MAX_TASKS_PER_CHILD = 100
  437. # : 任务过期时间,不建议直接写86400,应该让这样的magic数字表述更明显
  438. CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24
  439. #: 结果储存
  440. CELERY_RESULT_BACKEND = env('CELERY_RESULT_BACKEND')
  441. CELERYD_LOG_FORMAT = '[%(asctime)s] %(levelname)s[%(processName)s] %(module)s [%(name)s:%(lineno)d]: %(message)s'
  442. CELERYD_TASK_LOG_FORMAT = '[%(asctime)s] %(levelname)s[%(processName)s] %(module)s [%(name)s:%(lineno)d]:' \
  443. ' [%(task_name)s(%(task_id)s)] %(message)s'