我正在用SSE編寫測試應用程序,但我的問題是 ReadTimeout和WriteTimeout正在每隔10秒關閉客戶端連接,因此主頁面正在丟失數據。Http服務器讀寫超時和服務器端事件
我該如何管理這個問題,一起服務SSE和網頁,而沒有goroutines泄漏風險和SSE工作?
服務器:
server := &http.Server{Addr: addr,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
Handler: s.mainHandler(),
}
處理程序:
func sseHandler(w http.ResponseWriter, r *http.Requests) {
f, ok := w.(http.Flusher)
if !ok {
http.Error(w, "Streaming not supported!", http.StatusInternalServerError)
log.Println("Streaming not supported")
return
}
messageChannel := make(chan string)
hub.addClient <- messageChannel
notify := w.(http.CloseNotifier).CloseNotify()
w.Header().Set("Content-Type", "text/event-stream")
w.Header().Set("Cache-Control", "no-cache")
w.Header().Set("Connection", "keep-alive")
for i := 0; i < 1440; {
select {
case msg := <-messageChannel:
jsonData, _ := json.Marshal(msg)
str := string(jsonData)
fmt.Fprintf(w, "data: {\"str\": %s, \"time\": \"%v\"}\n\n", str, time.Now())
f.Flush()
case <-time.After(time.Second * 60):
fmt.Fprintf(w, "data: {\"str\": \"No Data\"}\n\n")
f.Flush()
i++
case <-notify:
f.Flush()
i = 1440
hub.removeClient <- messageChannel
}
}
}
爲什麼不增加/禁用超時?你需要每個處理程序單獨的超時? – tomasz 2014-11-24 14:07:46
@tomasz可能很棒有一個不同的超時處理程序,我不知道是否有可能,也許有類似的情況下,我的一些最佳做法,我真的不知道它呢... – Mmeyer 2014-11-24 15:04:03