package notify import ( "net" "strings" "time" ) var connc net.Conn var clientSign map[string]chan string func init() { clientSign = make(map[string]chan string) } func Notify(key string) chan string { if _, ok := clientSign[key]; !ok { ch := make(chan string, 5) clientSign[key] = ch } return clientSign[key] } func store(key, value string) { if _, ok := clientSign[key]; !ok { ch := make(chan string, 5) ch <- value clientSign[key] = ch return } clientSign[key] <- value } func NewNotifyC(netype, value string) error { var err error connc, err = net.Dial(netype, value) if err != nil { return err } go cnotify() go func() { for { buf := make([]byte, 8192) n, err := connc.Read(buf) Queue.ParseMessage(buf[0:n], connc) if err != nil { connc.Close() notifychan <- 0 go NewNotifyC(netype, value) break } } }() return nil } func Send(name string) error { _, err := connc.Write(Queue.BuildMessage(name)) return err } func cnotify() { for { select { case <-notifychan: break default: } data, err := Queue.RestoreOne() if err != nil { time.Sleep(time.Millisecond * 20) continue } strs := strings.SplitN(data.Msg, "||", 2) if len(strs) < 2 { continue } go store(strs[0], strs[1]) } }