瀏覽代碼

thud messages from remote clients in separate goroutine with delay

Vladimir Petrov 9 年之前
父節點
當前提交
d29553674e
共有 1 個文件被更改,包括 19 次插入2 次删除
  1. 19 2
      hookexecutor/executor.go

+ 19 - 2
hookexecutor/executor.go

@@ -25,6 +25,8 @@ const (
 	DefaultHeartbeatTrigger = 5 * time.Second
 	DefaultHeartbeatTrigger = 5 * time.Second
 	DefaultHeartbeatTimeout = 10 * time.Second
 	DefaultHeartbeatTimeout = 10 * time.Second
 	DefaultMessageLengthCap = 4 * 1024
 	DefaultMessageLengthCap = 4 * 1024
+
+	DefaultDelayForMessages = 1 * time.Second
 )
 )
 
 
 type IncomingEvent struct {
 type IncomingEvent struct {
@@ -60,6 +62,7 @@ type Executor struct {
 	outbox         chan *Message
 	outbox         chan *Message
 	cmdInbox       chan string
 	cmdInbox       chan string
 	clientRequests chan chan clientReply
 	clientRequests chan chan clientReply
+	stop           chan struct{}
 
 
 	clients []*clientInfo
 	clients []*clientInfo
 	counter int
 	counter int
@@ -75,6 +78,7 @@ func NewExecutor(s stream.Stream) *Executor {
 		make(chan *Message, DefaultOutboxBufferSize),
 		make(chan *Message, DefaultOutboxBufferSize),
 		make(chan string, DefaultInboxBufferSize),
 		make(chan string, DefaultInboxBufferSize),
 		make(chan chan clientReply, DefaultInboxBufferSize),
 		make(chan chan clientReply, DefaultInboxBufferSize),
+		make(chan struct{}),
 		nil,
 		nil,
 		0,
 		0,
 	}
 	}
@@ -84,11 +88,13 @@ func (exc *Executor) Start() {
 	go exc.ListenAndServe(DefaultAddr)
 	go exc.ListenAndServe(DefaultAddr)
 	go exc.ListenAndServeJSON(DefaultJSONAddr)
 	go exc.ListenAndServeJSON(DefaultJSONAddr)
 	go exc.processEvents()
 	go exc.processEvents()
+	go exc.sendToBot()
 }
 }
 
 
 func (exc *Executor) Stop() {
 func (exc *Executor) Stop() {
 	close(exc.inbox)
 	close(exc.inbox)
 	close(exc.cmdInbox)
 	close(exc.cmdInbox)
+	close(exc.stop)
 }
 }
 
 
 func (exc *Executor) Run(cmd string) {
 func (exc *Executor) Run(cmd string) {
@@ -361,8 +367,6 @@ func (exc *Executor) processEvents() {
 
 
 			exc.clients = append(exc.clients, info)
 			exc.clients = append(exc.clients, info)
 			req <- clientReply{outbox, info}
 			req <- clientReply{outbox, info}
-		case msg := <-exc.outbox:
-			exc.SendMessageToBot(msg)
 		}
 		}
 	}
 	}
 }
 }
@@ -399,6 +403,19 @@ func (exc *Executor) sendMessage(msg *Message) {
 	exc.clients = aliveClients
 	exc.clients = aliveClients
 }
 }
 
 
+func (exc *Executor) sendToBot() {
+	defer stopPanic(exc, "sendToBot", func(_ error) { go exc.sendToBot() })
+	for {
+		select {
+		case msg := <-exc.outbox:
+			exc.SendMessageToBot(msg)
+			time.Sleep(DefaultDelayForMessages)
+		case <-exc.stop:
+			return
+		}
+	}
+}
+
 func (exc *Executor) SendMessageToBot(msg *Message) {
 func (exc *Executor) SendMessageToBot(msg *Message) {
 	m := entity.MSG(entity.GROUPCHAT)
 	m := entity.MSG(entity.GROUPCHAT)
 	m.To = "golang@conference.jabber.ru"
 	m.To = "golang@conference.jabber.ru"