diff --git a/server/streamxserver/server_gen.go b/server/streamxserver/server_gen.go index 9b46f928a1..f9ec27aad2 100644 --- a/server/streamxserver/server_gen.go +++ b/server/streamxserver/server_gen.go @@ -4,11 +4,14 @@ import ( "context" "errors" "reflect" + "sync" "github.com/cloudwego/kitex/pkg/serviceinfo" "github.com/cloudwego/kitex/pkg/streamx" ) +var invokerCache sync.Map + func InvokeStream[Req, Res any]( ctx context.Context, smode serviceinfo.StreamingMode, handler any, reqArgs streamx.StreamReqArgs, resArgs streamx.StreamResArgs) (err error) { @@ -36,9 +39,16 @@ func InvokeStream[Req, Res any]( } // handler call - // TODO: cache handler - rhandler := reflect.ValueOf(shandler.Handler) - mhandler := rhandler.MethodByName(sArgs.Stream().Method()) + cacheKey := reflect.TypeOf(shandler.Handler).String() + sArgs.Stream().Method() + var mhandler reflect.Value + if v, ok := invokerCache.Load(cacheKey); ok { + mhandler = v.(reflect.Value) + } else { + rhandler := reflect.ValueOf(shandler.Handler) + mhandler = rhandler.MethodByName(sArgs.Stream().Method()) + invokerCache.Store(cacheKey, mhandler) + } + streamInvoke := func(ctx context.Context, streamArgs streamx.StreamArgs, reqArgs streamx.StreamReqArgs, resArgs streamx.StreamResArgs) (err error) { switch smode { case serviceinfo.StreamingUnary: