Interval.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. const robot = require('./robot')
  2. const web = require('./web')
  3. const {logger} = require("./utils/logger");
  4. const {tr} = require("date-fns/locale");
  5. const path = require("path");
  6. const file = require("./utils/file");
  7. const {getRustConfig} = require("./config");
  8. const http = require("./utils/http");
  9. /*******
  10. * 定时任务
  11. * **** */
  12. function init() {
  13. // reportNodeStatus()
  14. reportDel()
  15. reportSearchPositions()
  16. reportAmount()
  17. cacheLogs()
  18. cachePredictorState()
  19. logger.info('--定时任务 启动');
  20. }
  21. function reportNodeStatus() {
  22. const intervalInMilliseconds = 5000;
  23. setInterval(() => {
  24. // logger.info('当前1',robot.appMap);
  25. web.robotNodeStatus()
  26. }, intervalInMilliseconds);
  27. }
  28. //定时清理机器人
  29. function reportDel() {
  30. const intervalInMilliseconds = 2000;
  31. setInterval(() => {
  32. // logger.info('当前1',robot.appMap);
  33. robot.appMap.forEach((value, key) => {
  34. if (value.id !== -1) {
  35. // logger.info(`清理没用机器人开始111!`,value);
  36. robot.delRobot(value)
  37. }
  38. });
  39. }, intervalInMilliseconds);
  40. }
  41. // 定时扫描,如果发现机器人关闭或者错误,并且停止时间超过1分钟以上了,就进行清仓检查
  42. function reportSearchPositions() {//DOTO node 代码修改完毕,待测试
  43. const intervalInMilliseconds = 1000 * 60;
  44. setInterval(() => {
  45. // logger.info('--当前 定时检查清仓');
  46. robot.appMap.forEach((value, key) => {
  47. logger.info('发起清仓检查:' + value.id + "停机时间:" + value.closeTime + "当前时间:" + new Date().getTime());
  48. let isStartTime = value.closeTime + (1000 * 60)
  49. if (value.id !== -1
  50. && isStartTime <= new Date().getTime()
  51. && (value.threadStatus === robot.RobotStatus.STOPPED || value.threadStatus === robot.RobotStatus.ERROR)
  52. // && value.isClearance === false
  53. ) {
  54. logger.info('--发起清仓' + value.id);
  55. robot.searchPositions({
  56. "id": value.id,
  57. "callPort": value.port,
  58. "path": value.path,
  59. "programName": value.programName,
  60. "strategyName": value.strategyName,
  61. })
  62. // value.isClearance = true
  63. }
  64. });
  65. }, intervalInMilliseconds);
  66. }
  67. // 2秒一次对正在运行的,服务器进行余额比对,发生变化则上报
  68. function reportAmount() {
  69. // 设置定时器,每隔一定时间(比如每隔5秒)发送一次GET请求
  70. const intervalInMilliseconds = 1000;
  71. setInterval(() => {
  72. // logger.info('当前2',robot.appMap);
  73. robot.appMap.forEach((value, key) => {
  74. var thisTime = new Date().getTime()
  75. if (value.threadStatus === robot.RobotStatus.RUNNING &&
  76. (thisTime - value.threadStartTime) > (1000 * 10)
  77. ) {
  78. robot.robotAmount(value)
  79. }
  80. });
  81. }, intervalInMilliseconds);
  82. }
  83. // 2024年10月28日
  84. // 问题: http请求过多,加上请求耗时,容易造成拥堵,所以开启线程异步缓存 机器人程序日志,机器人状态详情信息,http直接返回数据
  85. function cacheLogs() {
  86. // 设置定时器,每隔一定时间(比如每隔5秒)发送一次GET请求
  87. const intervalInMilliseconds = 1000 * 2;
  88. setInterval(() => {
  89. // logger.info('当前2',robot.appMap);
  90. robot.appMap.forEach((value, key) => {
  91. new Promise((resolve, reject) => {
  92. var thisTime = new Date().getTime()
  93. let port = value.port
  94. let n = 200
  95. let messlist = value.messlist
  96. if (value.id !== -1 && port !== -1) {
  97. logger.info(`~~~缓存日志${value.id}`)
  98. try {
  99. var logPath = "./logs" + port
  100. logger.info(`访问-日志相对目录:${logPath}`)
  101. const directoryPath = path.resolve(logPath);
  102. file.checkPathSync(directoryPath)
  103. file.getLastFile(logPath, 5, async (fileNameList, _) => {
  104. logger.info('-----文件:', fileNameList);
  105. let result = await file.getLatestLogEntries(logPath, fileNameList.reverse(), n);
  106. if (messlist.length === 0) {
  107. value.messlist = result
  108. } else {
  109. if (messlist[0] !== result[0]) {
  110. value.messlist = result
  111. }
  112. }
  113. });
  114. } catch (e) {
  115. logger.info('异步缓存日志异常~~', e);
  116. }
  117. }
  118. resolve()
  119. }).then(r => {
  120. logger.info('异步缓存日志异常~~失败');
  121. });
  122. });
  123. }, intervalInMilliseconds);
  124. }
  125. function cachePredictorState() {
  126. // 设置定时器,每隔一定时间(比如每隔5秒)发送一次GET请求
  127. const intervalInMilliseconds = 1500;
  128. setInterval(() => {
  129. // logger.info('当前2',robot.appMap);
  130. var config = getRustConfig()
  131. robot.appMap.forEach((value, key) => {
  132. var thisTime = new Date().getTime()
  133. let port = value.port
  134. let predictorState = value.predictorState
  135. if (value.id !== -1 && port !== -1 && value.threadStatus === robot.RobotStatus.RUNNING) {
  136. logger.info(`~~~缓存机器人状态详情${value.id}`)
  137. var accUrl = "http://127.0.0.1:" + port
  138. http.request_get(`${accUrl}/predictor_state`, {...config.headers})
  139. .then((data) => {
  140. let result = JSON.parse(data);
  141. if (predictorState.length === 0) {
  142. value.predictorState = result
  143. } else {
  144. if (predictorState[0] !== predictorState[0]) {
  145. value.predictorState = result
  146. }
  147. }
  148. }).catch((error) => {
  149. logger.info(`异步缓存predictorState异常~~ ${error.message}`)
  150. });
  151. }
  152. });
  153. }, intervalInMilliseconds);
  154. }
  155. module.exports = {
  156. init
  157. };