当前位置:网站首页>The golang timer uses the stepped pit: the timer is executed once a day

The golang timer uses the stepped pit: the timer is executed once a day

2022-07-05 07:17:00 java_ xxxx

golang The timer uses a stepping pit

Project background and problems

There is such a requirement in the project , You need to use a timer every morning 10:00:00 Handle some business logic , But I met 2 A question .
Bubibi , Code up

go func() {
    
		for {
    
			now := time.Now()
			var next time.Time

			// Every day 10:00 On Tao with Su Shi 
			if now.Hour() < 10 || now.Hour() == 10 {
    
				next = now
			} else {
    
				next = now.Add(time.Hour * 24)
			}

			// Every day 10:00 On Tao with Su Shi 
			next = time.Date(next.Year(), next.Month(), next.Day(), 10, 0, 0, 0, next.Location())

			//  The fixed time has passed , Prevent project restart , Trigger the timer again . Such as 10 Click to execute once ,10:10 Restart the service , At this time, it is set to execute on the next day 

			logger.Info("UpdateOndutys Now=%s Next=%s", now, next)
			timer := time.NewTimer(next.Sub(now))

			select {
    
			case ts := <-timer.C:
				// go function() // Business logic 
				logger.Info("Start UpdateOnduty_7day ts=%s", ts.String())
				time.Sleep(120 * time.Second)
				timer.Stop()
			}
		}
	}()

problem 1:golang One feature of the timer is that you set an expiration time, and it will still execute , such as , It's morning now 10:00:00, Then I set the timer today 9:00:00 To carry out , It will still execute .
problem 2: If the timer is in the morning 10:00:00 perform , Then I 10:44:44 Project restarted , Then it executes again , But requirements are implemented only once a day .

Solution

Before we start the timer, judge the current time and the execution time of the timer , If the current time is greater than the timer execution time , It indicates that the timer has been executed , Then set it to execute tomorrow . If the current time is less than the timer time, the timer has not been executed , Follow the normal logic today .

go func() {
    
		for {
    
			now := time.Now()
			var next time.Time

			// Every day 10:00 On Tao with Su Shi 
			if now.Hour() < 10 || now.Hour() == 10 {
    
				next = now
			} else {
    
				next = now.Add(time.Hour * 24)
			}

			// Every day 10:00 On Tao with Su Shi 
			next = time.Date(next.Year(), next.Month(), next.Day(), 10, 0, 0, 0, next.Location())

			//  The fixed time has passed , Prevent project restart , Trigger the timer again . Such as 10 Click to execute once ,10:10 Restart the service , At this time, it is set to execute on the next day 
			if now.Unix() > next.Unix() {
    
				next = now.Add(time.Hour * 24)
				next = time.Date(next.Year(), next.Month(), next.Day(), 10, 0, 0, 0, next.Location())
			}

			logger.Info("UpdateOndutys Now=%s Next=%s", now, next)
			timer := time.NewTimer(next.Sub(now))

			select {
    
			case ts := <-timer.C:
				// go function() // Business logic 
				logger.Info("Start UpdateOnduty_7day ts=%s", ts.String())
				time.Sleep(120 * time.Second)
				timer.Stop()
			}
		}
	}()
原网站

版权声明
本文为[java_ xxxx]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/186/202207050714447270.html