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