xiongzhu há 2 anos atrás
pai
commit
acbcf2a17b
3 ficheiros alterados com 58 adições e 3 exclusões
  1. 1 0
      package.json
  2. 31 3
      src/task/task.service.ts
  3. 26 0
      yarn.lock

+ 1 - 0
package.json

@@ -68,6 +68,7 @@
     "mongoose": "^7.0.4",
     "mysql2": "^3.1.2",
     "nestjs-typeorm-paginate": "^4.0.3",
+    "node-schedule": "^2.1.1",
     "nodemailer": "^6.9.1",
     "p-timeout": "^6.1.1",
     "passport": "^0.6.0",

+ 31 - 3
src/task/task.service.ts

@@ -1,4 +1,4 @@
-import { Injectable, Logger } from '@nestjs/common'
+import { Injectable, Logger, OnModuleInit } from '@nestjs/common'
 import { InjectRepository } from '@nestjs/typeorm'
 import { Web3Service } from 'src/web3/web3.service'
 import { Task } from './entities/task.entity'
@@ -15,8 +15,9 @@ import { Web3Result } from 'src/web3/model/web3-result'
 import { randomAmount } from 'src/utils/common'
 import { EventEmitter2 } from '@nestjs/event-emitter'
 import { setTimeout } from 'timers/promises'
+import schedule from 'node-schedule'
 @Injectable()
-export class TaskService {
+export class TaskService implements OnModuleInit {
     constructor(
         private readonly web3Service: Web3Service,
         private readonly accountsService: AccountsService,
@@ -27,6 +28,25 @@ export class TaskService {
         private eventEmitter: EventEmitter2
     ) {}
 
+    async onModuleInit() {
+        const tasks = await this.taskRepository.findBy({
+            status: TaskStatus.Pending
+        })
+        for (let task of tasks) {
+            if (task.startTime <= new Date()) {
+                try {
+                    this.runTask(task)
+                } catch (error) {}
+            } else {
+                schedule.scheduleJob(task.startTime, () => {
+                    try {
+                        this.runTask(task)
+                    } catch (error) {}
+                })
+            }
+        }
+    }
+
     async findAll(req: PageRequest<Task>): Promise<Pagination<Task>> {
         return await paginate<Task>(this.taskRepository, req.page, req.search)
     }
@@ -41,7 +61,15 @@ export class TaskService {
             ...createTask
         })
         if (!createTask.startTime || createTask.startTime <= new Date()) {
-            this.runTask(task)
+            try {
+                this.runTask(task)
+            } catch (error) {}
+        } else {
+            schedule.scheduleJob(createTask.startTime, () => {
+                try {
+                    this.runTask(task)
+                } catch (error) {}
+            })
         }
         return task
     }

+ 26 - 0
yarn.lock

@@ -3681,6 +3681,13 @@ create-require@^1.1.0:
   resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz"
   integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
 
+cron-parser@^4.2.0:
+  version "4.8.1"
+  resolved "https://registry.npmmirror.com/cron-parser/-/cron-parser-4.8.1.tgz#47062ea63d21d78c10ddedb08ea4c5b6fc2750fb"
+  integrity sha512-jbokKWGcyU4gl6jAfX97E1gDpY12DJ1cLJZmoDzaAln/shZ+S3KBFBuA2Q6WeUN4gJf/8klnV1EfvhA2lK5IRQ==
+  dependencies:
+    luxon "^3.2.1"
+
 cron@2.3.1:
   version "2.3.1"
   resolved "https://registry.npmmirror.com/cron/-/cron-2.3.1.tgz#71caa566ffef60ada9183b8677df4afa9a214ad7"
@@ -6521,6 +6528,11 @@ log-symbols@^5.1.0:
     chalk "^5.0.0"
     is-unicode-supported "^1.1.0"
 
+long-timeout@0.1.1:
+  version "0.1.1"
+  resolved "https://registry.npmmirror.com/long-timeout/-/long-timeout-0.1.1.tgz#9721d788b47e0bcb5a24c2e2bee1a0da55dab514"
+  integrity sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==
+
 long@^5.0.0:
   version "5.2.3"
   resolved "https://registry.npmmirror.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1"
@@ -7142,6 +7154,15 @@ node-releases@^2.0.8:
   resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz"
   integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==
 
+node-schedule@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.npmmirror.com/node-schedule/-/node-schedule-2.1.1.tgz#6958b2c5af8834954f69bb0a7a97c62b97185de3"
+  integrity sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ==
+  dependencies:
+    cron-parser "^4.2.0"
+    long-timeout "0.1.1"
+    sorted-array-functions "^1.3.0"
+
 nodemailer-express-handlebars@^6.0.0:
   version "6.0.0"
   resolved "https://registry.npmjs.org/nodemailer-express-handlebars/-/nodemailer-express-handlebars-6.0.0.tgz"
@@ -8309,6 +8330,11 @@ socks@^2.3.3, socks@^2.7.1:
     ip "^2.0.0"
     smart-buffer "^4.2.0"
 
+sorted-array-functions@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz#8605695563294dffb2c9796d602bd8459f7a0dd5"
+  integrity sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==
+
 source-map-support@0.5.13:
   version "0.5.13"
   resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz"