first push
This commit is contained in:
commit
33ec38ebbe
|
@ -0,0 +1,28 @@
|
||||||
|
package l_notify
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"os/signal"
|
||||||
|
"syscall"
|
||||||
|
)
|
||||||
|
|
||||||
|
func keepAlive() {
|
||||||
|
// 创建一个通道来监听操作系统信号
|
||||||
|
stop := make(chan bool)
|
||||||
|
|
||||||
|
// 监听系统信号
|
||||||
|
signalChan := make(chan os.Signal, 1)
|
||||||
|
signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM)
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
<-signalChan
|
||||||
|
stop <- true
|
||||||
|
}()
|
||||||
|
|
||||||
|
select {
|
||||||
|
case <-stop:
|
||||||
|
fmt.Println("Received stop signal, exiting...")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
module gitea.cdlsxd.cn/self-tools/l_notify
|
||||||
|
|
||||||
|
go 1.23.6
|
||||||
|
|
||||||
|
require (
|
||||||
|
gitea.cdlsxd.cn/self-tools/l_request v1.0.4 // indirect
|
||||||
|
github.com/robfig/cron/v3 v3.0.1 // indirect
|
||||||
|
)
|
|
@ -0,0 +1,87 @@
|
||||||
|
package l_notify
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"gitea.cdlsxd.cn/self-tools/l_request"
|
||||||
|
"github.com/robfig/cron/v3"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Notify struct {
|
||||||
|
Request *l_request.Request
|
||||||
|
DoFuc func() (l_request.Response, error) //测试用
|
||||||
|
DelayList []int32 //[30,60,120...]:从前往后分别延迟30秒,60秒,120秒...推送,[60]:每隔60秒推送一次
|
||||||
|
ResultHandle func(l_request.Response, error) (stop bool) //推送结果处理函数,stop为true时表示停止推送
|
||||||
|
cron *cron.Cron
|
||||||
|
stop chan struct{}
|
||||||
|
currenEntry cron.EntryID
|
||||||
|
isLoop bool
|
||||||
|
i int8
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *Notify) Notify() error {
|
||||||
|
//必要参数检测
|
||||||
|
err := n.check()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(n.DelayList) == 1 {
|
||||||
|
//如果只有一次,则默认循环推送
|
||||||
|
n.isLoop = true
|
||||||
|
}
|
||||||
|
|
||||||
|
n.stop = make(chan struct{})
|
||||||
|
//启动定时器
|
||||||
|
n.cron = cron.New()
|
||||||
|
n.next()
|
||||||
|
n.cron.Start()
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *Notify) next() {
|
||||||
|
if n.i+1 > int8(len(n.DelayList)) {
|
||||||
|
//当不存在下次执行,则退出定时器
|
||||||
|
n.cron.Stop()
|
||||||
|
close(n.stop)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
time := "@every " + fmt.Sprintf("%ds", n.DelayList[n.i])
|
||||||
|
n.currenEntry, _ = n.cron.AddFunc(time, func() {
|
||||||
|
e := n.ResultHandle(n.DoFuc())
|
||||||
|
if n.isLoop {
|
||||||
|
//循环推送直到成功
|
||||||
|
if e {
|
||||||
|
n.stop <- struct{}{}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
n.stop <- struct{}{}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
//开启信号监听
|
||||||
|
n.registerListener()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *Notify) check() error {
|
||||||
|
if n.Request == nil && n.DoFuc == nil {
|
||||||
|
return fmt.Errorf("未初始化Request")
|
||||||
|
}
|
||||||
|
if len(n.DelayList) == 0 {
|
||||||
|
return fmt.Errorf("未设置推送延迟")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *Notify) registerListener() {
|
||||||
|
//注册信号监听通道
|
||||||
|
go func() {
|
||||||
|
select {
|
||||||
|
case <-n.stop:
|
||||||
|
n.cron.Remove(n.currenEntry)
|
||||||
|
n.i += 1
|
||||||
|
n.next()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
package l_notify
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"gitea.cdlsxd.cn/self-tools/l_request"
|
||||||
|
cron2 "github.com/robfig/cron/v3"
|
||||||
|
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestNotify(t *testing.T) {
|
||||||
|
var a int32
|
||||||
|
c := &Notify{
|
||||||
|
DoFuc: func() (l_request.Response, error) {
|
||||||
|
a++
|
||||||
|
return l_request.Response{StatusCode: int(a)}, nil
|
||||||
|
},
|
||||||
|
DelayList: []int32{3},
|
||||||
|
ResultHandle: func(r l_request.Response, e error) (stop bool) {
|
||||||
|
fmt.Printf("%d-----%s\n", r.StatusCode, time.Now().Format(time.TimeOnly))
|
||||||
|
if r.StatusCode == 5 {
|
||||||
|
a = 0
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
},
|
||||||
|
}
|
||||||
|
err := c.Notify()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Print(a)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNotify2(t *testing.T) {
|
||||||
|
cron := cron2.New()
|
||||||
|
id, _ := cron.AddFunc("@every 1s", func() { fmt.Println("Every 1") })
|
||||||
|
cron.Start()
|
||||||
|
time.Sleep(3 * time.Second)
|
||||||
|
cron.Remove(id)
|
||||||
|
cron.AddFunc("@every 1s", func() { fmt.Println("Every 2") })
|
||||||
|
//cron.Start()
|
||||||
|
select {}
|
||||||
|
}
|
Loading…
Reference in New Issue