GoFrame gcron-基本使用

2022-04-09 10:14 更新

基本使用

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é)果為:

[
    {
        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 

單例定時(shí)任務(wù)

單例定時(shí)任務(wù),即同時(shí)只能有一個(gè)該任務(wù)正在運(yùn)行。當(dāng)?shù)诙€(gè)相同的定時(shí)任務(wù)觸發(fā)執(zhí)行時(shí),如果發(fā)現(xiàn)已有該任務(wù)正在執(zhí)行,第二個(gè)任務(wù)將會(huì)退出不執(zhí)行,定時(shí)器將會(huì)繼續(xù)等待下一次定時(shí)任務(wù)的觸發(fā)檢測(cè),以此類(lèi)推。可以使用?AddSingleton?添加單例定時(shí)任務(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 
...

單次定時(shí)任務(wù)

單次定時(shí)任務(wù),?AddOnce?方法用于添加只運(yùn)行一次的定時(shí)任務(wù),當(dāng)運(yùn)行一次數(shù)后該定時(shí)任務(wù)自動(dòng)銷(xiāo)毀,?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ù)的定時(shí)任務(wù)

指定次數(shù)的定時(shí)任務(wù),?AddTimes?方法用于添加運(yùn)行指定次數(shù)的定時(shí)任務(wù),當(dāng)運(yùn)行?times?次數(shù)后該定時(shí)任務(wù)自動(dòng)銷(xiāo)毀,?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

獲取所有注冊(cè)的定時(shí)任務(wù)信息

獲取所有注冊(cè)的定時(shí)任務(wù)信息,?Entries?方法用于獲取當(dāng)前所有已注冊(cè)的定時(shí)任務(wù)信息,以切片的形式返回(按注冊(cè)時(shí)間?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?搜索返回具有指定“名稱(chēng)”的計(jì)劃任務(wù)。(返回定時(shí)任務(wù)?*Entry?對(duì)象指針),如果找不到,則返回?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?方法用于停止定時(shí)任務(wù)(?Stop?會(huì)停止但不會(huì)刪除), 可通過(guò)?name?參數(shù)指定需要停止的任務(wù)名稱(chēng),如果沒(méi)有指定?name?,它將停止整個(gè)?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ù)名稱(chēng)?name?刪除定時(shí)任務(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ù)啟動(dòng)

?Start?方法用于啟動(dòng)定時(shí)任務(wù)(?Add?后自動(dòng)啟動(dòng)定時(shí)任務(wù)), 可通過(guò)?name?參數(shù)指定需要啟動(dòng)的任務(wù)名稱(chēng)。如果沒(méi)有指定?name?,它將啟動(dòng)整個(gè)?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è)置日志輸出的文件以及級(jí)別。默認(rèn)情況下僅會(huì)輸出?LEVEL_WARN | LEVEL_ERRO | LEVEL_CRIT?錯(cuò)誤級(jí)別的日志(包括定時(shí)任務(wù)運(yùn)行異常日志),運(yùn)行日志以?LEVEL_DEBUG?的級(jí)別進(jìn)行記錄,因此默認(rèn)不會(huì)記錄。 ?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é)果為:



以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)