From 289b57ac6848aa4b9d72375ce7ab5669354b53e0 Mon Sep 17 00:00:00 2001 From: wuqinqiang <1185079673@qq.com> Date: Fri, 19 Sep 2025 16:23:59 +0800 Subject: [PATCH 1/2] fix: SSE handler template blocking --- tools/goctl/api/gogen/sse_handler.tpl | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/tools/goctl/api/gogen/sse_handler.tpl b/tools/goctl/api/gogen/sse_handler.tpl index 7221670952b1..1541b775db8f 100644 --- a/tools/goctl/api/gogen/sse_handler.tpl +++ b/tools/goctl/api/gogen/sse_handler.tpl @@ -30,11 +30,12 @@ func {{.HandlerName}}(svcCtx *svc.ServiceContext) http.HandlerFunc { // w.Header().Set("Cache-Control", "no-cache") // w.Header().Set("Connection", "keep-alive") client := make(chan {{.ResponseType}}, 16) - defer func() { - close(client) - }() + l := {{.LogicName}}.New{{.LogicType}}(r.Context(), svcCtx) threading.GoSafeCtx(r.Context(), func() { + defer func() { + close(client) + }() err := l.{{.Call}}({{if .HasRequest}}&req, {{end}}client) if err != nil { logc.Errorw(r.Context(), "{{.HandlerName}}", logc.Field("error", err)) @@ -44,7 +45,10 @@ func {{.HandlerName}}(svcCtx *svc.ServiceContext) http.HandlerFunc { for { select { - case data := <-client: + case data, ok := <-client: + if !ok { + return + } output, err := json.Marshal(data) if err != nil { logc.Errorw(r.Context(), "{{.HandlerName}}", logc.Field("error", err)) From 63c7162c5f78d2f2580e9f0ee1a18e0572f60e96 Mon Sep 17 00:00:00 2001 From: Kevin Wan Date: Sat, 20 Sep 2025 22:40:59 +0800 Subject: [PATCH 2/2] Update tools/goctl/api/gogen/sse_handler.tpl Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- tools/goctl/api/gogen/sse_handler.tpl | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tools/goctl/api/gogen/sse_handler.tpl b/tools/goctl/api/gogen/sse_handler.tpl index 1541b775db8f..84aea28b8f8d 100644 --- a/tools/goctl/api/gogen/sse_handler.tpl +++ b/tools/goctl/api/gogen/sse_handler.tpl @@ -33,9 +33,7 @@ func {{.HandlerName}}(svcCtx *svc.ServiceContext) http.HandlerFunc { l := {{.LogicName}}.New{{.LogicType}}(r.Context(), svcCtx) threading.GoSafeCtx(r.Context(), func() { - defer func() { - close(client) - }() + defer close(client) err := l.{{.Call}}({{if .HasRequest}}&req, {{end}}client) if err != nil { logc.Errorw(r.Context(), "{{.HandlerName}}", logc.Field("error", err))