123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- package linker
-
- import (
- "sync"
- "time"
- )
-
- var (
- rt *ReTry
- once sync.Once
- )
-
- type ReTry struct {
- items sync.Map
- timeout time.Duration
- }
-
- type Item struct {
- Channel string
- Ctx Context
- Value interface{}
- }
-
- func NewRetry(timeout time.Duration) *ReTry {
- once.Do(func() {
- rt = &ReTry{items: sync.Map{}, timeout: timeout}
- })
-
- return rt
- }
-
- func (rt *ReTry) Put(key interface{}, value *Item) {
- rt.items.Store(key, value)
-
- go func(rt *ReTry) {
- <-time.NewTimer(rt.timeout).C
- if v, ok := rt.items.Load(key); ok {
- if i, ok := v.(*Item); ok {
- i.Ctx.Write(i.Channel, i.Value)
- rt.Delete(key)
- }
- }
-
- return
- }(rt)
- }
-
- func (rt *ReTry) Delete(key interface{}) {
- rt.items.Delete(key)
- }
|