新聞中心
基本使用
package main
import (
"context"
"github.com/GOgf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gcron"
"github.com/gogf/gf/v2/os/gctx"
"time"
)
func main() {
var (
err error
ctx = gctx.New()
)
_, err = gcron.Add(ctx, "* * * * * *", func(ctx context.Context) {
g.Log().Print(ctx, "Every second")
}, "MySecondCronJob")
if err != nil {
panic(err)
}
_, err = gcron.Add(ctx, "0 30 * * * *", func(ctx context.Context) {
g.Log().Print(ctx, "Every hour on the half hour")
})
if err != nil {
panic(err)
}
_, err = gcron.Add(ctx, "@hourly", func(ctx context.Context) {
g.Log().Print(ctx, "Every hour")
})
if err != nil {
panic(err)
}
_, err = gcron.Add(ctx, "@every 1h30m", func(ctx context.Context) {
g.Log().Print(ctx, "Every hour thirty")
})
if err != nil {
panic(err)
}
g.Dump(gcron.Entries())
time.Sleep(3 * time.Second)
g.Log().Print(ctx, `stop cronjob "MySecondCronJob"`)
gcron.Stop("MySecondCronJob")
time.Sleep(3 * time.Second)
g.Log().Print(ctx, `start cronjob "MySecondCronJob"`)
gcron.Start("MySecondCronJob")
time.Sleep(3 * time.Second)
}
執(zhí)行后,輸出結(jié)果為:

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),八公山企業(yè)網(wǎng)站建設(shè),八公山品牌網(wǎng)站建設(shè),網(wǎng)站定制,八公山網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,八公山網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
[
{
Name: "MySecondCronJob",
Job: 0x14077e0,
Time: "2021-11-14 12:13:53.445132 +0800 CST m=+0.006167069",
},
{
Name: "cron-1",
Job: 0x14078a0,
Time: "2021-11-14 12:13:53.44515 +0800 CST m=+0.006185688",
},
{
Name: "cron-2",
Job: 0x1407960,
Time: "2021-11-14 12:13:53.445161 +0800 CST m=+0.006196483",
},
{
Name: "cron-3",
Job: 0x1407a20,
Time: "2021-11-14 12:13:53.445218 +0800 CST m=+0.006252937",
},
]
2021-11-14 12:13:54.442 {189cwi9ngk0cfp7l8gcwciw100sr9cuu} Every second
2021-11-14 12:13:55.441 {189cwi9ngk0cfp7l8gcwciw100sr9cuu} Every second
2021-11-14 12:13:56.440 {189cwi9ngk0cfp7l8gcwciw100sr9cuu} Every second
2021-11-14 12:13:56.445 {189cwi9ngk0cfp7l8gcwciw100sr9cuu} stop cronjob "MySecondCronJob"
2021-11-14 12:13:59.445 {189cwi9ngk0cfp7l8gcwciw100sr9cuu} start cronjob "MySecondCronJob"
2021-11-14 12:14:00.443 {189cwi9ngk0cfp7l8gcwciw100sr9cuu} Every second
2021-11-14 12:14:01.442 {189cwi9ngk0cfp7l8gcwciw100sr9cuu} Every second
2021-11-14 12:14:02.443 {189cwi9ngk0cfp7l8gcwciw100sr9cuu} Every second
單例定時任務(wù)
單例定時任務(wù),即同時只能有一個該任務(wù)正在運(yùn)行。當(dāng)?shù)诙€相同的定時任務(wù)觸發(fā)執(zhí)行時,如果發(fā)現(xiàn)已有該任務(wù)正在執(zhí)行,第二個任務(wù)將會退出不執(zhí)行,定時器將會繼續(xù)等待下一次定時任務(wù)的觸發(fā)檢測,以此類推??梢允褂?AddSingleton?添加單例定時任務(wù)。
package main
import (
"context"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gcron"
"github.com/gogf/gf/v2/os/gctx"
"time"
)
func main() {
var (
err error
ctx = gctx.New()
)
_, err = gcron.AddSingleton(ctx, "* * * * * *", func(ctx context.Context) {
g.Log().Print(ctx, "doing")
time.Sleep(2 * time.Second)
})
if err != nil {
panic(err)
}
select {}
}
執(zhí)行后,輸出結(jié)果為:
2021-11-14 12:16:54.073 {189cwi9nmm0cfp7niz319fc100zrw0ig} doing
2021-11-14 12:16:57.072 {189cwi9nmm0cfp7niz319fc100zrw0ig} doing
2021-11-14 12:17:00.072 {189cwi9nmm0cfp7niz319fc100zrw0ig} doing
2021-11-14 12:17:03.071 {189cwi9nmm0cfp7niz319fc100zrw0ig} doing
2021-11-14 12:17:06.072 {189cwi9nmm0cfp7niz319fc100zrw0ig} doing
2021-11-14 12:17:09.072 {189cwi9nmm0cfp7niz319fc100zrw0ig} doing
...
單次定時任務(wù)
單次定時任務(wù),?AddOnce?方法用于添加只運(yùn)行一次的定時任務(wù),當(dāng)運(yùn)行一次數(shù)后該定時任務(wù)自動銷毀,?Size?方法可以查看運(yùn)行狀態(tài),相關(guān)方法:
func main() {
var (
ctx = gctx.New()
)
cron := gcron.New()
array := garray.New(true)
cron.AddOnce(ctx, "@every 2s", func(ctx context.Context) {
array.Append(1)
})
fmt.Println(cron.Size(),array.Len())
time.Sleep(3000 * time.Millisecond)
fmt.Println(cron.Size(),array.Len())
}
執(zhí)行后,輸出結(jié)果為:
1 0
0 1
指定次數(shù)的定時任務(wù)
指定次數(shù)的定時任務(wù),?AddTimes?方法用于添加運(yùn)行指定次數(shù)的定時任務(wù),當(dāng)運(yùn)行?times?次數(shù)后該定時任務(wù)自動銷毀,?Size?方法可以查看運(yùn)行狀態(tài),相關(guān)方法:
func main() {
var (
ctx = gctx.New()
)
cron := gcron.New()
array := garray.New(true)
cron.AddTimes(ctx, "@every 2s", 2,func(ctx context.Context) {
array.Append(1)
})
fmt.Println(cron.Size(), array.Len())
time.Sleep(3000 * time.Millisecond)
fmt.Println(cron.Size(), array.Len())
time.Sleep(3000 * time.Millisecond)
fmt.Println(cron.Size(), array.Len())
}
執(zhí)行后,輸出結(jié)果為:
1 0
1 1
0 2
獲取所有注冊的定時任務(wù)信息
獲取所有注冊的定時任務(wù)信息,?Entries?方法用于獲取當(dāng)前所有已注冊的定時任務(wù)信息,以切片的形式返回(按注冊時間?asc?排序),相關(guān)方法:
func main() {
var (
ctx = gctx.New()
)
cron := gcron.New()
array := garray.New(true)
cron.AddTimes(ctx, "@every 1s", 2,func(ctx context.Context) {
array.Append(1)
},"cron1")
cron.AddOnce(ctx, "@every 1s",func(ctx context.Context) {
array.Append(1)
},"cron2")
entries := cron.Entries()
for k, v := range entries{
fmt.Println(k,v.Name,v.Time)
}
time.Sleep(3000 * time.Millisecond)
fmt.Println(array.Len())
}
執(zhí)行后,輸出結(jié)果為:
0 cron2 2022-02-09 10:11:47.2421345 +0800 CST m=+0.159116501
1 cron1 2022-02-09 10:11:47.2421345 +0800 CST m=+0.159116501
3
任務(wù)搜索
?Search?搜索返回具有指定“名稱”的計(jì)劃任務(wù)。(返回定時任務(wù)?*Entry?對象指針),如果找不到,則返回?nil?。相關(guān)方法:
func main() {
var (
ctx = gctx.New()
)
cron := gcron.New()
array := garray.New(true)
cron.AddTimes(ctx, "@every 1s", 2,func(ctx context.Context) {
array.Append(1)
},"cron1")
cron.AddOnce(ctx, "@every 1s",func(ctx context.Context) {
array.Append(1)
},"cron2")
search := cron.Search("cron2")
g.Log().Print(ctx, search)
time.Sleep(3000 * time.Millisecond)
fmt.Println(array.Len())
// Output:
// 3
}
執(zhí)行后,輸出結(jié)果為:
2022-02-09 10:52:30.011 {18a909957cfed11680c1b145da1ef096} {"Name":"cron2","Time":"2022-02-09T10:52:29.9972842+08:00"}
任務(wù)停止
?Stop?方法用于停止定時任務(wù)(?Stop?會停止但不會刪除), 可通過?name?參數(shù)指定需要停止的任務(wù)名稱,如果沒有指定?name?,它將停止整個?cron?。相關(guān)方法:
func main() {
var (
ctx = gctx.New()
)
cron := gcron.New()
array := garray.New(true)
cron.AddTimes(ctx, "@every 2s", 1,func(ctx context.Context) {
array.Append(1)
},"cron1")
cron.AddOnce(ctx, "@every 2s",func(ctx context.Context) {
array.Append(1)
},"cron2")
fmt.Println(array.Len(),cron.Size())
cron.Stop("cron2")
fmt.Println(array.Len(),cron.Size())
time.Sleep(3000 * time.Millisecond)
fmt.Println(array.Len(),cron.Size())
// Output:
// 1
// 1
}
執(zhí)行后,輸出結(jié)果為:
0 2
0 2
1 1
任務(wù)停止并刪除
?Remove?方法用于根據(jù)名稱?name?刪除定時任務(wù)(停止并刪除);相關(guān)方法:
func main() {
var (
ctx = gctx.New()
)
cron := gcron.New()
array := garray.New(true)
cron.AddTimes(ctx, "@every 2s", 1,func(ctx context.Context) {
array.Append(1)
},"cron1")
cron.AddOnce(ctx, "@every 2s",func(ctx context.Context) {
array.Append(1)
},"cron2")
fmt.Println(array.Len(),cron.Size())
cron.Remove("cron2")
fmt.Println(array.Len(),cron.Size())
time.Sleep(3000 * time.Millisecond)
fmt.Println(array.Len(),cron.Size())
// Output:
// 0 2
// 0 1
// 1 0
}
執(zhí)行后,輸出結(jié)果為:
0 2
0 1
1 0
任務(wù)啟動
?Start?方法用于啟動定時任務(wù)(?Add?后自動啟動定時任務(wù)), 可通過?name?參數(shù)指定需要啟動的任務(wù)名稱。如果沒有指定?name?,它將啟動整個?cron?。相關(guān)方法:
func main() {
var (
ctx = gctx.New()
)
cron := gcron.New()
array := garray.New(true)
cron.AddOnce(ctx, "@every 2s",func(ctx context.Context) {
array.Append(1)
},"cron2")
cron.Stop("cron2")
time.Sleep(3000 * time.Millisecond)
fmt.Println(array.Len(),cron.Size())
cron.Start("cron2")
time.Sleep(3000 * time.Millisecond)
fmt.Println(array.Len(),cron.Size())
// Output:
// 0 1
// 1 0
}
執(zhí)行后,輸出結(jié)果為:
0 1
1 0
日志記錄功能
?gcron?支持日志記錄功能,并可設(shè)置日志輸出的文件以及級別。默認(rèn)情況下僅會輸出?LEVEL_WARN | LEVEL_ERRO | LEVEL_CRIT?錯誤級別的日志(包括定時任務(wù)運(yùn)行異常日志),運(yùn)行日志以?LEVEL_DEBUG?的級別進(jìn)行記錄,因此默認(rèn)不會記錄。 ?gcron?使用了GoFrame框架統(tǒng)一的日志組件,因此可以復(fù)用日志組件的所有特性。相關(guān)方法:
func SetLogger(logger *glog.Logger)
func GetLogger() *glog.Logger
使用示例:
package main
import (
"context"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gcron"
"github.com/gogf/gf/v2/os/gctx"
"github.com/gogf/gf/v2/os/glog"
"time"
)
func main() {
var (
err error
ctx = gctx.New()
logger = glog.New()
)
logger.SetLevel(glog.LEVEL_ALL)
gcron.SetLogger(logger)
_, err = gcron.Add(ctx, "* * * * * ?", func(ctx context.Context) {
g.Log().Info(ctx, "test")
})
if err != nil {
panic(err)
}
time.Sleep(3 * time.Second)
}
執(zhí)行后,終端輸出結(jié)果為:
網(wǎng)頁名稱:創(chuàng)新互聯(lián)GoFrame教程:GoFramegcron-基本使用
本文URL:http://www.fisionsoft.com.cn/article/ccccops.html


咨詢
建站咨詢
