Skip to content

Commit 8fb801c

Browse files
authored
🔀 Merge pull request #136 from leancloud/cloud-queue
✨ Add `Cloud.getTaskInfo`
2 parents 7b543da + 624b170 commit 8fb801c

4 files changed

Lines changed: 73 additions & 10 deletions

File tree

API.md

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -102,20 +102,43 @@ AV.Cloud.run(name: string, params: object, options?: object): Promise
102102
在队列中运行云函数。
103103
104104
```javascript
105-
AV.Cloud.enqueue(name: string, params: object, options?: object): Promise<TaskInfo>
105+
AV.Cloud.enqueue(name: string, params: object, options?: object): Promise<{uniqueId: string}>
106106
```
107107
108108
`options` 的属性包括:
109109
110-
* `attempts?: number`:最大重试次数,默认 `3`.
111-
* `backoff?: number`:重试间隔(毫秒),默认 `60000`.
112-
* `delay?: number`:延时执行(毫秒)。
113-
* `notify?: string`: 将执行结果通知到指定云函数。
114-
* `retryTimeout?: boolean`: 将超时视作失败来进行重试,默认 `true`.
110+
- `attempts?: number`:最大重试次数,默认 `1`
111+
- `backoff?: number`:重试间隔(毫秒),默认 `60000`(一分钟)
112+
- `delay?: number`:延时执行(毫秒)
113+
- `deliveryMode?: string`:超时时的行为,值是 `atLeastOnce`(至少一次,可能会重试多次)、`atMostOnce`(至多一次,不会重试),默认是 `atLeastOnce`
114+
- `keepResult?: number` 在队列中保留结果的时间(毫秒),默认 `300000`(五分钟)
115+
- `priority?: number`:优先级,默认是当前时间戳,设置为更小的值可以在队列拥堵时让特定任务更快地被执行
116+
- `timeout?: number`:超时时间(毫秒),默认 `15000`,目前最大也是 `15000`,后续会提供更长的时间
117+
- `uniqueId?: string`:任务的唯一 ID,会据此进行去重,最长 32 个字符,默认是随机的 UUID
118+
119+
### AV.Cloud.getTaskInfo
120+
121+
查询队列任务结果。
122+
123+
```javascript
124+
AV.Cloud.getTaskInfo(uniqueId: string): Promise<TaskInfo>
125+
```
115126
116127
`TaskInfo` 的属性包括:
117128
118-
- `uniqueId`:任务的唯一 Id,会包含在日志中。
129+
- `uniqueId: string`:任务的唯一 ID
130+
- `status: string`:任务的状态,包括 `queued`(等待或正在执行)、`success`(执行成功)、`failed`(执行失败)
131+
132+
执行完成的 `TaskInfo` 会有:
133+
134+
- `finishedAt?: string` 执行完成(成功或失败)的时间
135+
- `statusCode?: number` 云函数响应的 HTTP 状态码
136+
- `result?: object` 来自云函数的响应
137+
138+
执行失败的 `TaskInfo` 会有:
139+
140+
- `error?: string` 错误提示
141+
- `retryAt?: string` 下次重试的时间
119142
120143
### 定义 Class Hook
121144

leanengine.d.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,20 @@ export namespace Cloud {
7777
retryTimeout?: boolean,
7878
}
7979

80+
enum TaskStatus {
81+
Queued = 'queued',
82+
Success = 'success',
83+
Failed = 'failed'
84+
}
85+
8086
interface TaskInfo {
8187
uniqueId: string
88+
status: TaskStatus
89+
finishedAt?: Date
90+
statusCode?: number
91+
result?: any
92+
error?: string
93+
retryAt?: Date
8294
}
8395

8496
interface MiddlewareOptions {
@@ -123,7 +135,8 @@ export namespace Cloud {
123135

124136
export function run(name: string, params?: Object, options?: RunOptions): Promise<any>;
125137
export function rpc(name: string, params?: Object, options?: RunOptions): Promise<any>;
126-
export function enqueue(name: string, params?: Object, options?: EnqueueOptions): Promise<TaskInfo>;
138+
export function enqueue(name: string, params?: Object, options?: EnqueueOptions): Promise<{uniqueId: string}>;
139+
export function getTaskInfo(uniqueId: string): Promise<TaskInfo>;
127140

128141
export function beforeSave(className: string, handler: ClassHookFunction): void;
129142
export function afterSave(className: string, handler: ClassHookFunction): void;

lib/cloud.js

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,15 +103,32 @@ Cloud.enqueue = function(name, params, options) {
103103

104104
return AV.request({
105105
method: 'POST',
106-
path: '/engine/cloud-queue/enqueue',
106+
path: '/engine/cloud-queue/tasks',
107107
data: _.extend({
108108
function: name,
109-
params: params
109+
params: params || {}
110110
}, options),
111111
authOptions: {useMasterKey: true}
112112
});
113113
};
114114

115+
Cloud.getTaskInfo = function(uniqueId) {
116+
return AV.request({
117+
method: 'GET',
118+
path: `/engine/cloud-queue/tasks/${uniqueId}`
119+
}).then( body => {
120+
if (body.finishedAt) {
121+
body.finishedAt = new Date(body.finishedAt);
122+
}
123+
124+
if (body.retryAt) {
125+
body.retryAt = new Date(body.retryAt);
126+
}
127+
128+
return body;
129+
});
130+
};
131+
115132
Cloud.beforeSave = function(nameOrClass, func) {
116133
defineClassHook(className(nameOrClass), '__before_save_for_', func);
117134
};

test/function-test.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -480,4 +480,14 @@ describe('functions', function() {
480480
.expect('access-control-allow-origin', 'http://foo.bar')
481481
.expect(200, done);
482482
});
483+
484+
it('enqueue & getTaskInfo', async function() {
485+
const {uniqueId} = await AV.Cloud.enqueue('hello');
486+
487+
uniqueId.length.should.be.equal(36);
488+
489+
const taskInfo = await AV.Cloud.getTaskInfo(uniqueId);
490+
491+
taskInfo.status.should.be.a.String();
492+
})
483493
});

0 commit comments

Comments
 (0)