multi-tasks 1.2.6 → 1.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +98 -95
- package/examples/example0/run.js +37 -37
- package/examples/example1/RunnerConsumer.js +25 -25
- package/examples/example1/RunnerProducer.js +34 -34
- package/examples/example1/run.js +8 -8
- package/examples/example2/RunnerConsumer.js +39 -39
- package/examples/example2/RunnerProducer.js +34 -34
- package/examples/example2/run.js +22 -22
- package/examples/example3-dynamicIncreasing/RunnerConsumer.js +175 -175
- package/examples/example3-dynamicIncreasing/RunnerProducer.js +48 -48
- package/examples/example3-dynamicIncreasing/run.js +35 -35
- package/examples/example3-dynamicIncreasing/util.js +45 -45
- package/index.js +36 -36
- package/package.json +22 -22
- package/test/splitter.test.js +16 -16
- package/utils/makedir.js +28 -23
- package/utils/test_makedir.js +2 -2
- package/workers/SuperConsumer.js +105 -105
- package/workers/SuperProducer.js +96 -96
- package/workers/master.js +170 -170
- package/workers/report/report_status.js +51 -51
- package/workers/taskSplitter.js +29 -29
- package/workers/test/MyConsumer.js +24 -24
- package/workers/test/MyProducer.js +25 -25
- package/workers/test/test_master.js +11 -11
- package/workers/test/test_producer.js +3 -3
- package/workers/test/test_splitter.js +6 -6
package/index.js
CHANGED
|
@@ -1,37 +1,37 @@
|
|
|
1
|
-
const SuperProducer = require('./workers/SuperProducer');
|
|
2
|
-
const SuperConsumer = require('./workers/SuperConsumer');
|
|
3
|
-
const master = require('./workers/master');
|
|
4
|
-
const multiTasks = (config)=>{
|
|
5
|
-
if(!config.tasks){
|
|
6
|
-
throw 'Please provide tasks data';
|
|
7
|
-
};
|
|
8
|
-
if(!config.processTask){
|
|
9
|
-
throw 'Please provide processTask function';
|
|
10
|
-
};
|
|
11
|
-
class TestProducer extends SuperProducer {
|
|
12
|
-
// constructor
|
|
13
|
-
setTaskTrunkInfo(trunkInfo){
|
|
14
|
-
this.trunkInfo = trunkInfo;
|
|
15
|
-
}
|
|
16
|
-
getAllActions() {
|
|
17
|
-
return Promise.resolve(config.tasks);//return all your tasks as an array
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
class TestConsumer extends SuperConsumer {
|
|
21
|
-
processTask(taskProp){
|
|
22
|
-
console.log(`processing data:`, taskProp);
|
|
23
|
-
let result = config.processTask(taskProp);
|
|
24
|
-
return Promise.resolve(result);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
master.start(TestProducer, TestConsumer, {
|
|
29
|
-
...config
|
|
30
|
-
});
|
|
31
|
-
};
|
|
32
|
-
module.exports = {
|
|
33
|
-
SuperProducer,
|
|
34
|
-
SuperConsumer,
|
|
35
|
-
master,
|
|
36
|
-
multiTasks
|
|
1
|
+
const SuperProducer = require('./workers/SuperProducer');
|
|
2
|
+
const SuperConsumer = require('./workers/SuperConsumer');
|
|
3
|
+
const master = require('./workers/master');
|
|
4
|
+
const multiTasks = (config)=>{
|
|
5
|
+
if(!config.tasks){
|
|
6
|
+
throw 'Please provide tasks data';
|
|
7
|
+
};
|
|
8
|
+
if(!config.processTask){
|
|
9
|
+
throw 'Please provide processTask function';
|
|
10
|
+
};
|
|
11
|
+
class TestProducer extends SuperProducer {
|
|
12
|
+
// constructor
|
|
13
|
+
setTaskTrunkInfo(trunkInfo){
|
|
14
|
+
this.trunkInfo = trunkInfo;
|
|
15
|
+
}
|
|
16
|
+
getAllActions() {
|
|
17
|
+
return Promise.resolve(config.tasks);//return all your tasks as an array
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
class TestConsumer extends SuperConsumer {
|
|
21
|
+
processTask(taskProp){
|
|
22
|
+
console.log(`processing data:`, taskProp);
|
|
23
|
+
let result = config.processTask(taskProp);
|
|
24
|
+
return Promise.resolve(result);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
master.start(TestProducer, TestConsumer, {
|
|
29
|
+
...config
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
module.exports = {
|
|
33
|
+
SuperProducer,
|
|
34
|
+
SuperConsumer,
|
|
35
|
+
master,
|
|
36
|
+
multiTasks
|
|
37
37
|
}
|
package/package.json
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "multi-tasks",
|
|
3
|
-
"version": "1.2.
|
|
4
|
-
"description": "",
|
|
5
|
-
"main": "index.js",
|
|
6
|
-
"directories": {
|
|
7
|
-
"example": "example"
|
|
8
|
-
},
|
|
9
|
-
"scripts": {
|
|
10
|
-
"test": "jest"
|
|
11
|
-
},
|
|
12
|
-
"keywords": [
|
|
13
|
-
"multitask",
|
|
14
|
-
"worker",
|
|
15
|
-
"multithread"
|
|
16
|
-
],
|
|
17
|
-
"author": "zhanglei923@gmail.com",
|
|
18
|
-
"license": "MIT",
|
|
19
|
-
"devDependencies": {
|
|
20
|
-
"jest": "^29.7.0"
|
|
21
|
-
}
|
|
22
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "multi-tasks",
|
|
3
|
+
"version": "1.2.8",
|
|
4
|
+
"description": "",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"directories": {
|
|
7
|
+
"example": "example"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"test": "jest"
|
|
11
|
+
},
|
|
12
|
+
"keywords": [
|
|
13
|
+
"multitask",
|
|
14
|
+
"worker",
|
|
15
|
+
"multithread"
|
|
16
|
+
],
|
|
17
|
+
"author": "zhanglei923@gmail.com",
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"devDependencies": {
|
|
20
|
+
"jest": "^29.7.0"
|
|
21
|
+
}
|
|
22
|
+
}
|
package/test/splitter.test.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
let splitter = require('../workers/taskSplitter');
|
|
2
|
-
|
|
3
|
-
let createArray = (len)=>{
|
|
4
|
-
let alltasks = []
|
|
5
|
-
for(let i=0;i<len;i++){
|
|
6
|
-
alltasks.push(i)
|
|
7
|
-
}
|
|
8
|
-
return alltasks;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
test('test taskSplitter', async () => {
|
|
12
|
-
|
|
13
|
-
expect(splitter.split(createArray(3), 5).length).toBe(1);
|
|
14
|
-
expect(splitter.split(createArray(16), 5).length).toBe(4);
|
|
15
|
-
expect(splitter.split(createArray(101), 1).length).toBe(101);
|
|
16
|
-
expect(splitter.split(createArray(101), 33).length).toBe(4);
|
|
1
|
+
let splitter = require('../workers/taskSplitter');
|
|
2
|
+
|
|
3
|
+
let createArray = (len)=>{
|
|
4
|
+
let alltasks = []
|
|
5
|
+
for(let i=0;i<len;i++){
|
|
6
|
+
alltasks.push(i)
|
|
7
|
+
}
|
|
8
|
+
return alltasks;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
test('test taskSplitter', async () => {
|
|
12
|
+
|
|
13
|
+
expect(splitter.split(createArray(3), 5).length).toBe(1);
|
|
14
|
+
expect(splitter.split(createArray(16), 5).length).toBe(4);
|
|
15
|
+
expect(splitter.split(createArray(101), 1).length).toBe(101);
|
|
16
|
+
expect(splitter.split(createArray(101), 33).length).toBe(4);
|
|
17
17
|
});
|
package/utils/makedir.js
CHANGED
|
@@ -1,24 +1,29 @@
|
|
|
1
|
-
const fs = require('fs');
|
|
2
|
-
const path = require('path');
|
|
3
|
-
|
|
4
|
-
function sync(directoryPath) {
|
|
5
|
-
directoryPath = directoryPath.replace(/\\/g, '/');
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
|
|
4
|
+
function sync(directoryPath) {
|
|
5
|
+
directoryPath = directoryPath.replace(/\\/g, '/');
|
|
6
|
+
|
|
7
|
+
let isAbsPath = false;
|
|
8
|
+
if(directoryPath.startsWith('/')){
|
|
9
|
+
isAbsPath = true;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const directories = directoryPath.split('/');
|
|
13
|
+
|
|
14
|
+
let currentPath = isAbsPath ? '/':'';
|
|
15
|
+
for (let directory of directories) {
|
|
16
|
+
currentPath = path.join(currentPath, directory);
|
|
17
|
+
if (!fs.existsSync(currentPath)) {
|
|
18
|
+
try {
|
|
19
|
+
fs.mkdirSync(currentPath);
|
|
20
|
+
} catch (err) {
|
|
21
|
+
if (err.code !== 'EEXIST') {
|
|
22
|
+
throw err;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
24
29
|
module.exports = {sync};
|
package/utils/test_makedir.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
let makedir = require('./makedir');
|
|
2
|
-
makedir.sync('c:/aaa/bb')
|
|
1
|
+
let makedir = require('./makedir');
|
|
2
|
+
makedir.sync('c:/aaa/bb')
|
|
3
3
|
makedir.sync('c:/cc/dd')
|
package/workers/SuperConsumer.js
CHANGED
|
@@ -1,106 +1,106 @@
|
|
|
1
|
-
let fs = require('fs');
|
|
2
|
-
let pathutil = require('path');
|
|
3
|
-
|
|
4
|
-
class SuperConsumer {
|
|
5
|
-
// constructor
|
|
6
|
-
constructor(mainid, subid) {
|
|
7
|
-
this.mainid = mainid;
|
|
8
|
-
this.subid = subid;
|
|
9
|
-
this.results = [];
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
setTaskTrunkInfo(trunkInfo){
|
|
13
|
-
this.trunkInfo = trunkInfo;
|
|
14
|
-
}
|
|
15
|
-
_run (mainTaskInfo, subTaskInfo, actions, results, errors, callback){
|
|
16
|
-
if(actions.length === 0) return callback({
|
|
17
|
-
finishedAt: new Date()*1,
|
|
18
|
-
results,
|
|
19
|
-
errors,
|
|
20
|
-
subTaskInfo
|
|
21
|
-
});
|
|
22
|
-
let taskProp = actions.shift();
|
|
23
|
-
|
|
24
|
-
if(this.processTask){
|
|
25
|
-
let result;
|
|
26
|
-
let hasException = false;
|
|
27
|
-
try{
|
|
28
|
-
result = this.processTask(taskProp);//rewrite this method in subclass
|
|
29
|
-
}catch(e){
|
|
30
|
-
hasException = true;
|
|
31
|
-
result = {taskProp, exception: 'Exception:' + e.toString()}
|
|
32
|
-
}
|
|
33
|
-
if(typeof result === 'undefined') result = {};
|
|
34
|
-
let ispromise = result instanceof Promise;
|
|
35
|
-
if(!ispromise){result = Promise.resolve(result);}
|
|
36
|
-
result.then((taskResult)=>{
|
|
37
|
-
if(!hasException){
|
|
38
|
-
results.push({taskProp, taskResult});
|
|
39
|
-
}else{
|
|
40
|
-
errors.push(taskResult);
|
|
41
|
-
}
|
|
42
|
-
}).catch((e)=>{
|
|
43
|
-
errors.push({taskProp, exception: 'Exception:' + e.toString()});
|
|
44
|
-
}).finally(()=>{
|
|
45
|
-
this._run(mainTaskInfo, subTaskInfo, actions, results, errors, callback);
|
|
46
|
-
});
|
|
47
|
-
}else{
|
|
48
|
-
this._run(mainTaskInfo, subTaskInfo, actions, results, errors, callback);
|
|
49
|
-
}
|
|
50
|
-
};
|
|
51
|
-
run (mainTaskInfo, subTaskInfo, taskInfo, callback){
|
|
52
|
-
let results = [];
|
|
53
|
-
let errors = [];
|
|
54
|
-
let actions = subTaskInfo.actions;
|
|
55
|
-
mainTaskInfo.defination = this.trunkInfo.defination;
|
|
56
|
-
this._run(mainTaskInfo, subTaskInfo, actions, results, errors, (result)=>{
|
|
57
|
-
callback(result)
|
|
58
|
-
})
|
|
59
|
-
|
|
60
|
-
}
|
|
61
|
-
runTasks (mainTaskInfo, subTaskInfo, message){
|
|
62
|
-
// console.log(`mainTaskInfo:`, mainTaskInfo)
|
|
63
|
-
// console.log(`subTaskInfo:`, subTaskInfo)
|
|
64
|
-
// console.log(`message:`, message)
|
|
65
|
-
|
|
66
|
-
this.mainTaskInfo = mainTaskInfo;
|
|
67
|
-
this.subTaskInfo = subTaskInfo;
|
|
68
|
-
|
|
69
|
-
return new Promise((resolve, reject)=>{
|
|
70
|
-
let mainid = mainTaskInfo.masterTaskId;
|
|
71
|
-
let subid = subTaskInfo.subid;
|
|
72
|
-
let taskfolderNew = mainTaskInfo.taskFolderNew;
|
|
73
|
-
let taskFolderResult = mainTaskInfo.taskFolderResult;
|
|
74
|
-
let taskFolderResultFailed = mainTaskInfo.taskFolderResultFailed;
|
|
75
|
-
this.mvTask(mainid, subid,'new','running', (taskFile)=>{//mark as running
|
|
76
|
-
let taskContent = fs.readFileSync(taskFile, 'utf8');
|
|
77
|
-
let taskInfo = JSON.parse(taskContent);
|
|
78
|
-
this.run(mainTaskInfo, subTaskInfo, taskInfo, (taskReport)=>{//invoke
|
|
79
|
-
let {results, errors} = taskReport;
|
|
80
|
-
let hasError = false;
|
|
81
|
-
if(errors && errors.length > 0) hasError = true;
|
|
82
|
-
let folder = !hasError ? taskFolderResult : taskFolderResultFailed;
|
|
83
|
-
let resultfile = pathutil.resolve(folder, `${subid}.json`)
|
|
84
|
-
fs.writeFileSync(resultfile, JSON.stringify(taskReport));
|
|
85
|
-
this.mvTask(mainid, subid,'running',(hasError ? 'finished_with_errors':'finished'), ()=>{//mark as finished
|
|
86
|
-
resolve({
|
|
87
|
-
mainid,
|
|
88
|
-
subid,
|
|
89
|
-
...message
|
|
90
|
-
})
|
|
91
|
-
});
|
|
92
|
-
});
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
mvTask (mainid, subid, from, to, callback) {
|
|
97
|
-
let __thisdir = this.mainTaskInfo.progressRootFolder;
|
|
98
|
-
let oldPath = pathutil.resolve(__thisdir, `./${from}/${subid}.task.json`);
|
|
99
|
-
let newPath = pathutil.resolve(__thisdir, `./${to}/${subid}.task.json`);
|
|
100
|
-
fs.rename(oldPath, newPath, (err) => {
|
|
101
|
-
if (err) throw err;
|
|
102
|
-
callback(newPath);
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
}
|
|
1
|
+
let fs = require('fs');
|
|
2
|
+
let pathutil = require('path');
|
|
3
|
+
|
|
4
|
+
class SuperConsumer {
|
|
5
|
+
// constructor
|
|
6
|
+
constructor(mainid, subid) {
|
|
7
|
+
this.mainid = mainid;
|
|
8
|
+
this.subid = subid;
|
|
9
|
+
this.results = [];
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
setTaskTrunkInfo(trunkInfo){
|
|
13
|
+
this.trunkInfo = trunkInfo;
|
|
14
|
+
}
|
|
15
|
+
_run (mainTaskInfo, subTaskInfo, actions, results, errors, callback){
|
|
16
|
+
if(actions.length === 0) return callback({
|
|
17
|
+
finishedAt: new Date()*1,
|
|
18
|
+
results,
|
|
19
|
+
errors,
|
|
20
|
+
subTaskInfo
|
|
21
|
+
});
|
|
22
|
+
let taskProp = actions.shift();
|
|
23
|
+
|
|
24
|
+
if(this.processTask){
|
|
25
|
+
let result;
|
|
26
|
+
let hasException = false;
|
|
27
|
+
try{
|
|
28
|
+
result = this.processTask(taskProp);//rewrite this method in subclass
|
|
29
|
+
}catch(e){
|
|
30
|
+
hasException = true;
|
|
31
|
+
result = {taskProp, exception: 'Exception:' + e.toString()}
|
|
32
|
+
}
|
|
33
|
+
if(typeof result === 'undefined') result = {};
|
|
34
|
+
let ispromise = result instanceof Promise;
|
|
35
|
+
if(!ispromise){result = Promise.resolve(result);}
|
|
36
|
+
result.then((taskResult)=>{
|
|
37
|
+
if(!hasException){
|
|
38
|
+
results.push({taskProp, taskResult});
|
|
39
|
+
}else{
|
|
40
|
+
errors.push(taskResult);
|
|
41
|
+
}
|
|
42
|
+
}).catch((e)=>{
|
|
43
|
+
errors.push({taskProp, exception: 'Exception:' + e.toString()});
|
|
44
|
+
}).finally(()=>{
|
|
45
|
+
this._run(mainTaskInfo, subTaskInfo, actions, results, errors, callback);
|
|
46
|
+
});
|
|
47
|
+
}else{
|
|
48
|
+
this._run(mainTaskInfo, subTaskInfo, actions, results, errors, callback);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
run (mainTaskInfo, subTaskInfo, taskInfo, callback){
|
|
52
|
+
let results = [];
|
|
53
|
+
let errors = [];
|
|
54
|
+
let actions = subTaskInfo.actions;
|
|
55
|
+
mainTaskInfo.defination = this.trunkInfo.defination;
|
|
56
|
+
this._run(mainTaskInfo, subTaskInfo, actions, results, errors, (result)=>{
|
|
57
|
+
callback(result)
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
}
|
|
61
|
+
runTasks (mainTaskInfo, subTaskInfo, message){
|
|
62
|
+
// console.log(`mainTaskInfo:`, mainTaskInfo)
|
|
63
|
+
// console.log(`subTaskInfo:`, subTaskInfo)
|
|
64
|
+
// console.log(`message:`, message)
|
|
65
|
+
|
|
66
|
+
this.mainTaskInfo = mainTaskInfo;
|
|
67
|
+
this.subTaskInfo = subTaskInfo;
|
|
68
|
+
|
|
69
|
+
return new Promise((resolve, reject)=>{
|
|
70
|
+
let mainid = mainTaskInfo.masterTaskId;
|
|
71
|
+
let subid = subTaskInfo.subid;
|
|
72
|
+
let taskfolderNew = mainTaskInfo.taskFolderNew;
|
|
73
|
+
let taskFolderResult = mainTaskInfo.taskFolderResult;
|
|
74
|
+
let taskFolderResultFailed = mainTaskInfo.taskFolderResultFailed;
|
|
75
|
+
this.mvTask(mainid, subid,'new','running', (taskFile)=>{//mark as running
|
|
76
|
+
let taskContent = fs.readFileSync(taskFile, 'utf8');
|
|
77
|
+
let taskInfo = JSON.parse(taskContent);
|
|
78
|
+
this.run(mainTaskInfo, subTaskInfo, taskInfo, (taskReport)=>{//invoke
|
|
79
|
+
let {results, errors} = taskReport;
|
|
80
|
+
let hasError = false;
|
|
81
|
+
if(errors && errors.length > 0) hasError = true;
|
|
82
|
+
let folder = !hasError ? taskFolderResult : taskFolderResultFailed;
|
|
83
|
+
let resultfile = pathutil.resolve(folder, `${subid}.json`)
|
|
84
|
+
fs.writeFileSync(resultfile, JSON.stringify(taskReport));
|
|
85
|
+
this.mvTask(mainid, subid,'running',(hasError ? 'finished_with_errors':'finished'), ()=>{//mark as finished
|
|
86
|
+
resolve({
|
|
87
|
+
mainid,
|
|
88
|
+
subid,
|
|
89
|
+
...message
|
|
90
|
+
})
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
mvTask (mainid, subid, from, to, callback) {
|
|
97
|
+
let __thisdir = this.mainTaskInfo.progressRootFolder;
|
|
98
|
+
let oldPath = pathutil.resolve(__thisdir, `./${from}/${subid}.task.json`);
|
|
99
|
+
let newPath = pathutil.resolve(__thisdir, `./${to}/${subid}.task.json`);
|
|
100
|
+
fs.rename(oldPath, newPath, (err) => {
|
|
101
|
+
if (err) throw err;
|
|
102
|
+
callback(newPath);
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
106
|
module.exports = SuperConsumer;
|
package/workers/SuperProducer.js
CHANGED
|
@@ -1,97 +1,97 @@
|
|
|
1
|
-
let fs = require('fs');
|
|
2
|
-
let pathutil = require('path');
|
|
3
|
-
let makeDir = require('../utils/makedir');
|
|
4
|
-
let splitter = require('./taskSplitter');
|
|
5
|
-
let fmtdigit = (n)=>{
|
|
6
|
-
return n > 9 ? "" + n: "0" + n;
|
|
7
|
-
}
|
|
8
|
-
let getDateTimeTxt = ()=>{
|
|
9
|
-
let d=new Date();
|
|
10
|
-
let YYYY=d.getFullYear()
|
|
11
|
-
let MM=fmtdigit(d.getMonth()+1);
|
|
12
|
-
let DD=fmtdigit(d.getDate());
|
|
13
|
-
let HH=fmtdigit(d.getHours());
|
|
14
|
-
let mm=fmtdigit(d.getMinutes());
|
|
15
|
-
let ss=fmtdigit(d.getSeconds());
|
|
16
|
-
return `${YYYY}-${MM}-${DD}_${HH}-${mm}-${ss}`;
|
|
17
|
-
};
|
|
18
|
-
class SuperProducer {
|
|
19
|
-
// constructor
|
|
20
|
-
constructor(taskname, parentfolder) {
|
|
21
|
-
this.taskname = taskname;
|
|
22
|
-
this.parentfolder = parentfolder;
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
getTaskName(){
|
|
27
|
-
return this.taskname;
|
|
28
|
-
}
|
|
29
|
-
getAllActions (){
|
|
30
|
-
//rewrite this method and return all your actions need to run
|
|
31
|
-
return new Promise();
|
|
32
|
-
}
|
|
33
|
-
generateTasks (quota, callback){
|
|
34
|
-
if(typeof quota === 'undefined' || !quota)quota=10;
|
|
35
|
-
let dateTimeText = getDateTimeTxt();//moment().format('YYYY-MM-DD_HH-mm-ss');
|
|
36
|
-
let masterTaskId = `${this.taskname}_${dateTimeText}`;
|
|
37
|
-
console.log('masterTaskId=',masterTaskId);
|
|
38
|
-
this.taskfolder = pathutil.resolve(this.parentfolder, masterTaskId)
|
|
39
|
-
let taskFolder = this.taskfolder;
|
|
40
|
-
//let taskfolder = pathutil.parse(__filename).dir;
|
|
41
|
-
//let taskFolder = pathutil.resolve(taskfolder, `./tasks/${masterTaskId}`);
|
|
42
|
-
let progressRootFolder = pathutil.resolve(taskFolder, './progress');
|
|
43
|
-
let resultsRootFolder = pathutil.resolve(taskFolder, './results');
|
|
44
|
-
|
|
45
|
-
let taskFolderNew = pathutil.resolve(progressRootFolder, './new');
|
|
46
|
-
let taskFolderRunning = pathutil.resolve(progressRootFolder, './running');
|
|
47
|
-
let taskFolderFinished = pathutil.resolve(progressRootFolder, './finished');
|
|
48
|
-
let taskFolderFailed= pathutil.resolve(progressRootFolder, './finished_with_errors');
|
|
49
|
-
|
|
50
|
-
let taskFolderResult = pathutil.resolve(resultsRootFolder, './succ');
|
|
51
|
-
let taskFolderResultFailed = pathutil.resolve(resultsRootFolder, './errors');
|
|
52
|
-
//let mainRptFolder = pathutil.resolve(taskfolder, './report');
|
|
53
|
-
|
|
54
|
-
//makeDir.sync(mainRptFolder);
|
|
55
|
-
makeDir.sync(taskFolderNew);
|
|
56
|
-
makeDir.sync(taskFolderRunning);
|
|
57
|
-
makeDir.sync(taskFolderFinished);
|
|
58
|
-
makeDir.sync(taskFolderFailed);
|
|
59
|
-
makeDir.sync(taskFolderResult);
|
|
60
|
-
makeDir.sync(taskFolderResultFailed);
|
|
61
|
-
|
|
62
|
-
this.getAllActions().then((allactions)=>{
|
|
63
|
-
|
|
64
|
-
let allSubTasks = splitter.split(allactions, quota);
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
console.log('allSubTasks=', allSubTasks.length)
|
|
68
|
-
|
|
69
|
-
let allSubTasksId = [];
|
|
70
|
-
|
|
71
|
-
allSubTasks.forEach((info, i)=>{
|
|
72
|
-
let subid = i;
|
|
73
|
-
info.subid = subid;
|
|
74
|
-
allSubTasksId.push(subid+'');
|
|
75
|
-
let taskfilepath = pathutil.resolve(taskFolderNew, `./${info.subid}.task.json`);
|
|
76
|
-
fs.writeFileSync(taskfilepath, JSON.stringify(info));
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
callback({
|
|
80
|
-
masterTaskId,
|
|
81
|
-
allSubTasksId,
|
|
82
|
-
//mainRptFolder,
|
|
83
|
-
progressRootFolder,
|
|
84
|
-
resultsRootFolder,
|
|
85
|
-
|
|
86
|
-
taskFolder,
|
|
87
|
-
taskFolderNew,
|
|
88
|
-
taskFolderRunning,
|
|
89
|
-
taskFolderFinished,
|
|
90
|
-
taskFolderResult,
|
|
91
|
-
taskFolderResultFailed,
|
|
92
|
-
});
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
1
|
+
let fs = require('fs');
|
|
2
|
+
let pathutil = require('path');
|
|
3
|
+
let makeDir = require('../utils/makedir');
|
|
4
|
+
let splitter = require('./taskSplitter');
|
|
5
|
+
let fmtdigit = (n)=>{
|
|
6
|
+
return n > 9 ? "" + n: "0" + n;
|
|
7
|
+
}
|
|
8
|
+
let getDateTimeTxt = ()=>{
|
|
9
|
+
let d=new Date();
|
|
10
|
+
let YYYY=d.getFullYear()
|
|
11
|
+
let MM=fmtdigit(d.getMonth()+1);
|
|
12
|
+
let DD=fmtdigit(d.getDate());
|
|
13
|
+
let HH=fmtdigit(d.getHours());
|
|
14
|
+
let mm=fmtdigit(d.getMinutes());
|
|
15
|
+
let ss=fmtdigit(d.getSeconds());
|
|
16
|
+
return `${YYYY}-${MM}-${DD}_${HH}-${mm}-${ss}`;
|
|
17
|
+
};
|
|
18
|
+
class SuperProducer {
|
|
19
|
+
// constructor
|
|
20
|
+
constructor(taskname, parentfolder) {
|
|
21
|
+
this.taskname = taskname;
|
|
22
|
+
this.parentfolder = parentfolder;
|
|
23
|
+
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
getTaskName(){
|
|
27
|
+
return this.taskname;
|
|
28
|
+
}
|
|
29
|
+
getAllActions (){
|
|
30
|
+
//rewrite this method and return all your actions need to run
|
|
31
|
+
return new Promise();
|
|
32
|
+
}
|
|
33
|
+
generateTasks (quota, callback){
|
|
34
|
+
if(typeof quota === 'undefined' || !quota)quota=10;
|
|
35
|
+
let dateTimeText = getDateTimeTxt();//moment().format('YYYY-MM-DD_HH-mm-ss');
|
|
36
|
+
let masterTaskId = `${this.taskname}_${dateTimeText}`;
|
|
37
|
+
console.log('masterTaskId=',masterTaskId);
|
|
38
|
+
this.taskfolder = pathutil.resolve(this.parentfolder, masterTaskId)
|
|
39
|
+
let taskFolder = this.taskfolder;
|
|
40
|
+
//let taskfolder = pathutil.parse(__filename).dir;
|
|
41
|
+
//let taskFolder = pathutil.resolve(taskfolder, `./tasks/${masterTaskId}`);
|
|
42
|
+
let progressRootFolder = pathutil.resolve(taskFolder, './progress');
|
|
43
|
+
let resultsRootFolder = pathutil.resolve(taskFolder, './results');
|
|
44
|
+
|
|
45
|
+
let taskFolderNew = pathutil.resolve(progressRootFolder, './new');
|
|
46
|
+
let taskFolderRunning = pathutil.resolve(progressRootFolder, './running');
|
|
47
|
+
let taskFolderFinished = pathutil.resolve(progressRootFolder, './finished');
|
|
48
|
+
let taskFolderFailed= pathutil.resolve(progressRootFolder, './finished_with_errors');
|
|
49
|
+
|
|
50
|
+
let taskFolderResult = pathutil.resolve(resultsRootFolder, './succ');
|
|
51
|
+
let taskFolderResultFailed = pathutil.resolve(resultsRootFolder, './errors');
|
|
52
|
+
//let mainRptFolder = pathutil.resolve(taskfolder, './report');
|
|
53
|
+
|
|
54
|
+
//makeDir.sync(mainRptFolder);
|
|
55
|
+
makeDir.sync(taskFolderNew);
|
|
56
|
+
makeDir.sync(taskFolderRunning);
|
|
57
|
+
makeDir.sync(taskFolderFinished);
|
|
58
|
+
makeDir.sync(taskFolderFailed);
|
|
59
|
+
makeDir.sync(taskFolderResult);
|
|
60
|
+
makeDir.sync(taskFolderResultFailed);
|
|
61
|
+
|
|
62
|
+
this.getAllActions().then((allactions)=>{
|
|
63
|
+
|
|
64
|
+
let allSubTasks = splitter.split(allactions, quota);
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
console.log('allSubTasks=', allSubTasks.length)
|
|
68
|
+
|
|
69
|
+
let allSubTasksId = [];
|
|
70
|
+
|
|
71
|
+
allSubTasks.forEach((info, i)=>{
|
|
72
|
+
let subid = i;
|
|
73
|
+
info.subid = subid;
|
|
74
|
+
allSubTasksId.push(subid+'');
|
|
75
|
+
let taskfilepath = pathutil.resolve(taskFolderNew, `./${info.subid}.task.json`);
|
|
76
|
+
fs.writeFileSync(taskfilepath, JSON.stringify(info));
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
callback({
|
|
80
|
+
masterTaskId,
|
|
81
|
+
allSubTasksId,
|
|
82
|
+
//mainRptFolder,
|
|
83
|
+
progressRootFolder,
|
|
84
|
+
resultsRootFolder,
|
|
85
|
+
|
|
86
|
+
taskFolder,
|
|
87
|
+
taskFolderNew,
|
|
88
|
+
taskFolderRunning,
|
|
89
|
+
taskFolderFinished,
|
|
90
|
+
taskFolderResult,
|
|
91
|
+
taskFolderResultFailed,
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
97
|
module.exports = SuperProducer;
|