加入重试

This commit is contained in:
marvzhang
2020-03-29 15:45:25 +08:00
parent 40ae93bc83
commit 9ac1bfc588
7 changed files with 99 additions and 7 deletions

View File

@@ -231,6 +231,7 @@ func main() {
authGroup.GET("/tasks/:id/log", routes.GetTaskLog) // 任务日志
authGroup.GET("/tasks/:id/results", routes.GetTaskResults) // 任务结果
authGroup.GET("/tasks/:id/results/download", routes.DownloadTaskResultsCsv) // 下载任务结果
authGroup.POST("/tasks/:id/restart", routes.RestartTask) // 重新开始任务
}
// 定时任务
{

View File

@@ -353,3 +353,15 @@ func CancelTask(c *gin.Context) {
}
HandleSuccess(c)
}
func RestartTask(c *gin.Context) {
id := c.Param("id")
uid := services.GetCurrentUserId(c)
if err := services.RestartTask(id, uid); err != nil {
HandleError(http.StatusInternalServerError, c, err)
return
}
HandleSuccess(c)
}

View File

@@ -675,6 +675,35 @@ func CancelTask(id string) (err error) {
return nil
}
func RestartTask(id string, uid bson.ObjectId) (err error) {
// 获取任务
oldTask, err := model.GetTask(id)
if err != nil {
log.Errorf("task not found, task id : %s, error: %s", id, err.Error())
debug.PrintStack()
return err
}
newTask := model.Task{
SpiderId: oldTask.SpiderId,
NodeId: oldTask.NodeId,
Param: oldTask.Param,
UserId: uid,
RunType: oldTask.RunType,
ScheduleId: bson.ObjectIdHex(constants.ObjectIdNull),
}
// 加入任务队列
_, err = AddTask(newTask)
if err != nil {
log.Errorf(err.Error())
debug.PrintStack()
return err
}
return nil
}
func AddTask(t model.Task) (string, error) {
// 生成任务ID
id := uuid.NewV4()

View File

@@ -34,7 +34,8 @@
/>
</el-select>
</el-form-item>
<el-form-item v-if="spiderForm.is_scrapy && !multiple" :label="$t('Scrapy Spider')" prop="spider" required inline-message>
<el-form-item v-if="spiderForm.is_scrapy && !multiple" :label="$t('Scrapy Spider')" prop="spider" required
inline-message>
<el-select v-model="form.spider" :placeholder="$t('Scrapy Spider')" :disabled="isLoading">
<el-option
v-for="s in spiderForm.spider_names"
@@ -67,15 +68,30 @@
<el-input v-model="form.param" :placeholder="$t('Parameters')"></el-input>
</template>
</el-form-item>
<el-form-item class="disclaimer-wrapper">
<el-form-item class="checkbox-wrapper">
<div>
<el-checkbox v-model="isAllowDisclaimer"/>
<span style="margin-left: 5px">我已阅读并同意 <a href="javascript:"
@click="onClickDisclaimer">免责声明</a> 所有内容</span>
<span v-if="lang === 'zh'" style="margin-left: 5px">
我已阅读并同意
<a href="javascript:" @click="onClickDisclaimer">
免责声明
</a>
所有内容
</span>
<span v-else style="margin-left: 5px">
I have read and agree all content in
<a href="javascript:" @click="onClickDisclaimer">
Disclaimer
</a>
</span>
</div>
<div v-if="!spiderForm.is_long_task && !multiple">
<el-checkbox v-model="isRedirect"/>
<span style="margin-left: 5px">跳转到任务详情页</span>
<span style="margin-left: 5px">{{$t('Redirect to task detail')}}</span>
</div>
<div v-if="false">
<el-checkbox v-model="isRetry"/>
<span style="margin-left: 5px">{{$t('Retry (Maximum 5 Times)')}}</span>
</div>
</el-form-item>
</el-form>
@@ -129,6 +145,7 @@ export default {
nodeList: []
},
isAllowDisclaimer: true,
isRetry: false,
isRedirect: true,
isLoading: false,
isParametersVisible: false,
@@ -142,6 +159,9 @@ export default {
...mapState('setting', [
'setting'
]),
...mapState('lang', [
'lang'
]),
isConfirmDisabled () {
if (this.isLoading) return true
if (!this.isAllowDisclaimer) return true
@@ -309,7 +329,7 @@ export default {
margin-bottom: 20px;
}
.crawl-confirm-dialog >>> .disclaimer-wrapper a {
.crawl-confirm-dialog >>> .checkbox-wrapper a {
color: #409eff;
}

View File

@@ -266,6 +266,9 @@ export default {
'Empty results': '空结果',
'Navigate to Spider': '导航到爬虫',
'Navigate to Node': '导航到节点',
'Restart': '重新运行',
'Redirect to task detail': '跳转到任务详情页',
'Retry (Maximum 5 Times)': '是否重试最多 5 ',
// 任务列表
'Node': '节点',

View File

@@ -142,6 +142,12 @@ const actions = {
ids: ids
})
},
restartTask ({ state, dispatch }, id) {
return request.post(`/tasks/${id}/restart`)
.then(() => {
dispatch('getTaskList')
})
},
getTaskLog ({ state, commit }, id) {
return request.get(`/tasks/${id}/log`)
.then(response => {

View File

@@ -143,11 +143,15 @@
:width="col.width">
</el-table-column>
</template>
<el-table-column :label="$t('Action')" align="left" fixed="right" width="120px">
<el-table-column :label="$t('Action')" align="left" fixed="right" width="150px">
<template slot-scope="scope">
<el-tooltip :content="$t('View')" placement="top">
<el-button type="primary" icon="el-icon-search" size="mini" @click="onView(scope.row)"></el-button>
</el-tooltip>
<el-tooltip :content="$t('Restart')" placement="top">
<el-button type="warning" icon="el-icon-refresh" size="mini"
@click="onRestart(scope.row, $event)"></el-button>
</el-tooltip>
<el-tooltip :content="$t('Remove')" placement="top">
<el-button type="danger" icon="el-icon-delete" size="mini"
@click="onRemove(scope.row, $event)"></el-button>
@@ -359,6 +363,23 @@ export default {
this.$st.sendEv('任务列表', '删除任务')
})
},
onRestart (row, ev) {
ev.stopPropagation()
this.$confirm(this.$t('Are you sure to restart this task?'), this.$t('Notification'), {
confirmButtonText: this.$t('Confirm'),
cancelButtonText: this.$t('Cancel'),
type: 'warning'
}).then(() => {
this.$store.dispatch('task/restartTask', row._id)
.then(() => {
this.$message({
type: 'success',
message: this.$t('Restarted successfully')
})
})
this.$st.sendEv('任务列表', '重新开始任务')
})
},
onView (row) {
this.$router.push(`/tasks/${row._id}`)
this.$st.sendEv('任务列表', '查看任务')