| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 | 
							- package rules
 
- 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
 
- }
 
 
  |