tickerが思い通りにならない!
常駐して定期的に実行したいjobがあるが、普通のtickerだと起動してからtickerを作った時からintervalカウントが始まるので、時刻ぴったりに設定できない。しかも、tickerはちゃんと12:00:00になるようにintervalを設定しても、たまに11:59:59.999に動くことがあって、処理したデータがダブって登録されてしまうことがあった。
tickerの使い方と、時刻制御の練習もかねて書いてみた。
https://github.com/xbridges/Scheduler
単純に、指定した時間間隔でぴったりにtickerが呼び出してくれる。
ex) sch, next := NewScheduler(3600, 0)
こんな感じで開始すると、毎時00分に一度tickerが発火します。
さらに、オフセット値を使うと、インターバルは毎時(3600)だけど、offset: 600とか設定すると、毎時05分にtickerが発火します。
偉そうに書いてるけど、やったことはただのラップ(笑
tickerを単純にラップしているだけなんですが、キモは、
is := time.Duration(interval) * time.Second // <-- 指定時刻をDurationに
n := time.Now() // <--現在の時刻
ns := n.Round(is) // <--現在時刻を、インターバル時刻でマスクして丸めるような感じ。
こーすると、たまにtickerが早めに動いて、59分59秒.9999になっちゃっても四捨五入してくれるので、時間がちゃんと次の00分に発火するようになります。
定期実行していてちょっとはまったのでメモしました。
2021/06/17: 追記
実際にこのライブラリを使って動作をしていたら、妙に変な動作になることがあって、致命的なバグがありました。申し訳ありません。
修正したものを別ライブラリとして作成しなおしました。恥ずかしい。
https://github.com/xbridges/StickyTicker
参考
http://okzk.hatenablog.com/entry/2015/12/01/001924
https://www.kaoriya.net/blog/2019/12/19/