Skip to content

Commit d1bf90f

Browse files
committed
#### Version 0.9.1
* feature: 新增输出Task信息与Counter信息的go原生HandlerFunc * fix: 修复CronTask对RunCounter统计逻辑BUG * refactor: 重构startCronTask实现 * About HttpOutput: - CounterOutputHttpHandler: 用于输出当前时刻所有Task的Counter信息 - TaskOutputHttpHandler: 用于输出所有Task的配置信息 - Code Example Link: https://github.com/devfeel/dotweb-start/blob/master/server/router.go#L20 * How to use: ~~~ go server.RegisterHandlerFunc(dotweb.RouteMethod_GET, "/task/counter", global.DotTask.CounterOutputHttpHandler) ~~~ * 2019-11-10 09:00
1 parent 5e61612 commit d1bf90f

File tree

4 files changed

+79
-41
lines changed

4 files changed

+79
-41
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
* 支持单独执行TaskHandler
1515
* 支持代码级重设Task的相关设置
1616
* 内建Task运行计数信息,包含执行与异常计数
17+
* 内建针对Task与Counter的OutputHttpHandler,可方便与WebServer自动集成
1718

1819

1920
## 安装:

crontask.go

Lines changed: 46 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -140,54 +140,59 @@ func NewCronTask(taskID string, isRun bool, express string, handler TaskHandle,
140140
//start cron task
141141
func startCronTask(task *CronTask) {
142142
now := time.Now()
143-
nowsecond := time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second(), 0, time.Local)
144-
afterTime := nowsecond.Add(time.Second).Sub(time.Now().Local())
143+
nowSecond := time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second(), 0, time.Local)
144+
afterTime := nowSecond.Add(time.Second).Sub(time.Now().Local())
145145
task.TimeTicker = time.NewTicker(DefaultPeriod)
146146
go func() {
147147
time.Sleep(afterTime)
148148
for {
149149
select {
150150
case <-task.TimeTicker.C:
151-
defer func() {
152-
task.CounterInfo().RunCounter.Inc(1)
153-
if err := recover(); err != nil {
154-
task.CounterInfo().ErrorCounter.Inc(1)
155-
task.taskService.Logger().Debug(task.TaskID, " cron handler recover error => ", err)
156-
if task.taskService.ExceptionHandler != nil {
157-
task.taskService.ExceptionHandler(task.Context(), fmt.Errorf("%v", err))
158-
}
159-
//goroutine panic, restart cron task
160-
startCronTask(task)
161-
task.taskService.Logger().Debug(task.TaskID, " goroutine panic, restart CronTask")
162-
}
163-
}()
164-
now := time.Now()
165-
if task.time_WeekDay.IsMatch(now) &&
166-
task.time_Month.IsMatch(now) &&
167-
task.time_Day.IsMatch(now) &&
168-
task.time_Hour.IsMatch(now) &&
169-
task.time_Minute.IsMatch(now) &&
170-
task.time_Second.IsMatch(now) {
171-
//do log
172-
//task.taskService.Logger().Debug(task.TaskID, " begin dohandler")
173-
if task.taskService != nil && task.taskService.OnBeforeHandler != nil {
174-
task.taskService.OnBeforeHandler(task.Context())
175-
}
176-
var err error
177-
if !task.Context().IsEnd {
178-
err = task.handler(task.Context())
179-
}
180-
if err != nil {
181-
task.CounterInfo().ErrorCounter.Inc(1)
182-
if task.taskService != nil && task.taskService.ExceptionHandler != nil {
183-
task.taskService.ExceptionHandler(task.Context(), err)
184-
}
185-
}
186-
if task.taskService != nil && task.taskService.OnEndHandler != nil {
187-
task.taskService.OnEndHandler(task.Context())
188-
}
189-
}
151+
doCronTask(task)
190152
}
191153
}
192154
}()
193155
}
156+
157+
func doCronTask(task *CronTask) {
158+
defer func() {
159+
if err := recover(); err != nil {
160+
task.CounterInfo().ErrorCounter.Inc(1)
161+
task.taskService.Logger().Debug(task.TaskID, " cron handler recover error => ", err)
162+
if task.taskService.ExceptionHandler != nil {
163+
task.taskService.ExceptionHandler(task.Context(), fmt.Errorf("%v", err))
164+
}
165+
//goroutine panic, restart cron task
166+
startCronTask(task)
167+
task.taskService.Logger().Debug(task.TaskID, " goroutine panic, restart CronTask")
168+
}
169+
}()
170+
now := time.Now()
171+
if task.time_WeekDay.IsMatch(now) &&
172+
task.time_Month.IsMatch(now) &&
173+
task.time_Day.IsMatch(now) &&
174+
task.time_Hour.IsMatch(now) &&
175+
task.time_Minute.IsMatch(now) &&
176+
task.time_Second.IsMatch(now) {
177+
178+
//inc run counter
179+
task.CounterInfo().RunCounter.Inc(1)
180+
//do log
181+
if task.taskService != nil && task.taskService.OnBeforeHandler != nil {
182+
task.taskService.OnBeforeHandler(task.Context())
183+
}
184+
var err error
185+
if !task.Context().IsEnd {
186+
err = task.handler(task.Context())
187+
}
188+
if err != nil {
189+
task.CounterInfo().ErrorCounter.Inc(1)
190+
if task.taskService != nil && task.taskService.ExceptionHandler != nil {
191+
task.taskService.ExceptionHandler(task.Context(), err)
192+
}
193+
}
194+
if task.taskService != nil && task.taskService.OnEndHandler != nil {
195+
task.taskService.OnEndHandler(task.Context())
196+
}
197+
}
198+
}

tasks_httphandler.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package task
2+
3+
import (
4+
"encoding/json"
5+
"net/http"
6+
)
7+
8+
// CounterOutputHttpHandler Http Handler for output counter info
9+
func (service *TaskService) CounterOutputHttpHandler(w http.ResponseWriter, r *http.Request) {
10+
str, _ := json.Marshal(service.GetAllTaskCountInfo())
11+
w.Write([]byte(str))
12+
}
13+
14+
// TaskOutputHttpHandler Http Handler for output task info
15+
func (service *TaskService) TaskOutputHttpHandler(w http.ResponseWriter, r *http.Request) {
16+
str, _ := json.Marshal(service.GetAllTasks())
17+
w.Write([]byte(str))
18+
}

version.MD

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,19 @@
11
## devfeel/dottask
22

3+
#### Version 0.9.1
4+
* feature: 新增输出Task信息与Counter信息的go原生HandlerFunc
5+
* fix: 修复CronTask对RunCounter统计逻辑BUG
6+
* refactor: 重构startCronTask实现
7+
* About HttpOutput:
8+
- CounterOutputHttpHandler: 用于输出当前时刻所有Task的Counter信息
9+
- TaskOutputHttpHandler: 用于输出所有Task的配置信息
10+
- Code Example Link: https://github.com/devfeel/dotweb-start/blob/master/server/router.go#L20
11+
* How to use:
12+
~~~ go
13+
server.RegisterHandlerFunc(dotweb.RouteMethod_GET, "/task/counter", global.DotTask.CounterOutputHttpHandler)
14+
~~~
15+
* 2019-11-10 09:00
16+
317
#### Version 0.9
418
* feature: 新增计数器单元Counter,用于Task执行的统计度量
519
* feature: 新增NewCronTask\NewLoopTask\NewQueueTask,用于创建独立的非强耦合TaskService的Task

0 commit comments

Comments
 (0)