golang:支持每周或者每天固定时间的事件触发器

package main

/*
Author: Guo
Function: 支持每周或者每天固定时间的事件触发器
*/

import (
	"fmt"
	"time"
)

//一天的秒数
const oneDaySecond = 1 * 24 * 60 * 60

//定时器服务
func tickerService(stop chan int) {
	var ticker *time.Ticker
	var duration int64
	var isWeekBak bool
	for {
		now := time.Now()
		// 判断是否是每周六定时,不是的话就是每天固定时间定时
		if isWeekBak && now.Weekday() != time.Sunday {
			//当从每周定时切换到每日定时时,需要清除停止信号,因为可能周定时Ticker并没有创建,也就是说定时任务没有开始
			if len(stop) == 1 {
				//fmt.Println("Clean Stop Chan")
				//fmt.Println("Clean Stop Chan Before: ", len(stop))
				<-stop
				//fmt.Println("Clean Stop Chan After: ", len(stop), " Num:", num, " time:", time.Now().Second())
			}
			time.Sleep(time.Second * 30)
			fmt.Println("Not This Day.")
			continue
		}
		//_, _, second := now.Clock()
		hour, minute, second := now.Clock()
		//当前时间
		//nowTime := time.Date(2020, 7, 18, 22, 25, second, 0, time.Local).Unix()
		nowTime := time.Date(2020, 7, 18, hour, minute, second, 0, time.Local).Unix()
		//每天的定时时间:22:25:30
		//setTime := time.Date(2020, 7, 18, 22, 25, 30, 0, time.Local).Unix()
		setTime := time.Date(2020, 7, 18, 22, 25, 30, 0, time.Local).Unix()
		minusTime := setTime - nowTime
		switch {
		case minusTime == 0:
			duration = oneDaySecond
		case minusTime > 0:
			duration = minusTime
		case minusTime < 0:
			duration = oneDaySecond + minusTime
		}
		ticker = time.NewTicker(time.Second * time.Duration(duration))
		select {
		//监听停止定时信号
		case <-stop:
			fmt.Println("Timer Been Shutdown.")
			//停止之前的定时器
			ticker.Stop()
			//模拟定时器切换
			isWeekBak = true
			break
		case <-ticker.C:
			fmt.Printf("Guo Bak Time Is Up. Time: %s\n", time.Now().Format("2006-01-02 15:04:05"))
			//TODO doSomeThing()
		}
	}
}

func main() {
	var stopChan = make(chan int, 1)
	go func() {
		for {
			select {
			case <-time.Tick(time.Second * 10):
				//清除之前的停止信号,因为可能不存在消费者,导致阻塞
				if len(stopChan) != 0 {
					<-stopChan
					//fmt.Println("Output: ", len(stopChan), " time:", time.Now().Second())
				}
				//发出停止信号,模拟定时的“改变事件”
				stopChan <- 100
				//fmt.Println("Input: ", len(stopChan), " time:", time.Now().Second())
				fmt.Printf("Guo Stop Time Is Up. Time: %s\n", time.Now().Format("2006-01-02 15:04:05"))
			}
		}
	}()
	go tickerService(stopChan)
	for{
		time.Sleep(time.Second * 1000)
	}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值