| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 | package rulesimport (	"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}
 |