| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- package router
- import (
- "sync"
- "time"
- )
- type RoutingEntry struct {
- tag string
- err error
- expire time.Time
- }
- func (this *RoutingEntry) Extend() {
- this.expire = time.Now().Add(time.Hour)
- }
- func (this *RoutingEntry) Expired() bool {
- return this.expire.Before(time.Now())
- }
- type RoutingTable struct {
- sync.RWMutex
- table map[string]*RoutingEntry
- }
- func NewRoutingTable() *RoutingTable {
- return &RoutingTable{
- table: make(map[string]*RoutingEntry),
- }
- }
- func (this *RoutingTable) Cleanup() {
- this.Lock()
- defer this.Unlock()
- for key, value := range this.table {
- if value.Expired() {
- delete(this.table, key)
- }
- }
- }
- func (this *RoutingTable) Set(destination string, tag string, err error) {
- this.Lock()
- defer this.Unlock()
- entry := &RoutingEntry{
- tag: tag,
- err: err,
- }
- entry.Extend()
- this.table[destination] = entry
- if len(this.table) > 1000 {
- go this.Cleanup()
- }
- }
- func (this *RoutingTable) Get(destination string) (bool, string, error) {
- this.RLock()
- defer this.RUnlock()
- entry, found := this.table[destination]
- if !found {
- return false, "", nil
- }
- entry.Extend()
- return true, entry.tag, entry.err
- }
|