|
|
- // Copyright (c) Shenyang Leading Edge Intelligent Technology Co., Ltd. All rights reserved.
-
- package container
-
- import (
- "errors"
- "fmt"
- "reflect"
- )
-
- // 服务方法信息
- type ServiceMethodInformation struct {
- // 方法名
- methodName string
- // 方法类型
- methodType Method
- // 调用器代理创建器列表
- callerBrokerBuilders []CallerBrokerBuilder
- // 路由创建器
- routerBuilder RouterBuilder
- }
-
- // 创建服务方法信息
- // 参数
- // 1.方法元数据
- // 返回值:
- // 1.服务方法信息
- // 异常
- // 1.方法类型不能为空
- // 2.方法名不能为空
- // 3.返回值数量错误
- // 4.最后一个返回值类型错误
- func NewServiceMethodInformation(method *reflect.Method) *ServiceMethodInformation {
-
- if method == nil {
- panic(fmt.Sprintf("方法类型不能为空!"))
- }
- methodName := method.Name
- methodType := method.Type
- if methodName == "" {
- panic(fmt.Sprintf("方法名不能为空!"))
- }
- if methodType.NumOut() < 1 || 2 < methodType.NumOut() {
- panic(fmt.Sprintf("返回值数量错误! 返回值数量: %d", methodType.NumOut()))
- }
- if methodType.Out(methodType.NumOut()-1) != errorType {
- panic(fmt.Sprintf("最后一个返回值类型错误! 类型:%s", methodType.Out(methodType.NumOut()-1)))
- }
- logBroker := NewLogBrokerBuilder("", methodName, "")
- err := logBroker.Check(methodType)
- if err != nil {
- panic(err.Error())
- }
- return &ServiceMethodInformation{methodName, methodType, []CallerBrokerBuilder{logBroker}, nil}
- }
-
- // 获取方法名
- // 返回值:
- // 1.方法名
- func (info *ServiceMethodInformation) MethodName() string {
- return info.methodName
- }
-
- // 获取方法类型
- // 返回值:
- // 1.方法类型
- func (info *ServiceMethodInformation) MethodType() Method {
- return info.methodType
- }
-
- // 添加调用器代理创建器
- // 参数
- // 1.调用器代理创建器
- // 异常
- // 1.调用器代理创建器不能设置为空
- func (info *ServiceMethodInformation) AppendBrokerBuilder(callerBrokerBuilder CallerBrokerBuilder) {
- if callerBrokerBuilder == nil {
- panic(fmt.Sprintf("调用器代理创建器不能设置为空!"))
- }
- if err := callerBrokerBuilder.Check(info.methodType); err != nil {
- panic(err.Error())
- }
- info.callerBrokerBuilders = append(info.callerBrokerBuilders, callerBrokerBuilder)
- }
-
- // 获取路由创建器
- // 返回值:
- // 1.路由创建器
- func (info *ServiceMethodInformation) RouterBuilder() RouterBuilder {
- return info.routerBuilder
- }
-
- // 设置路由创建器
- // 参数
- // 1.路由创建器
- // 异常
- // 1.路由创建器不能设置为空
- // 2.已经设置路由创建器
- func (info *ServiceMethodInformation) SetRouterBuilder(value RouterBuilder) {
- if value == nil {
- panic(fmt.Sprintf("路由创建器不能设置为空!"))
- }
- if info.routerBuilder != nil {
- panic(fmt.Sprintf("已经设置路由创建器!"))
- }
- info.routerBuilder = value
- }
-
- // 设置调用器代理创建器和路由创建器
- // 参数
- // 1.创建器集合
- // 返回值:
- // 1.错误
- // 异常
- // 1.路由创建器不能设置为空
- // 2.已经设置路由创建器
- // 3.调用器代理创建器不能设置为空
- func (info *ServiceMethodInformation) SetBuilders(builders BuilderSet) {
- info.SetRouterBuilder(builders.RouterBuilder)
- if builders.CallerBrokerBuilders != nil {
- for _, brokerBuilder := range builders.CallerBrokerBuilders {
- info.AppendBrokerBuilder(brokerBuilder)
- }
- }
- }
-
- // 创建方法句柄
- // 参数
- // 1.当前会话上下文
- // 2.服务实例
- // 返回值:
- // 1.方法句柄
- // 2.错误
- func (info *ServiceMethodInformation) BuildHandler(sessionContext *SessionContext, instance Instance) (*ServiceMethodHandler, error) {
-
- if sessionContext == nil {
- return nil, errors.New(fmt.Sprintf("会话上下文不能为空!"))
- }
- caller, err := instance.GetCaller(info.methodName)
- if err != nil {
- return nil, err
- }
- if caller == nil {
- return nil, errors.New(fmt.Sprintf("原始调用器不能为空!"))
- }
- for i := len(info.callerBrokerBuilders) - 1; i >= 0; i-- {
- brokerBuilder := info.callerBrokerBuilders[i]
- caller, err = brokerBuilder.Build(sessionContext, caller)
- if err != nil {
- return nil, err
- }
- if caller == nil {
- return nil, errors.New(fmt.Sprintf("第%d个调用器不能为空!", i+1))
- }
- }
- serviceMethodHandler, err := NewServiceMethodHandler(caller)
- if err != nil {
- return nil, err
- }
- return serviceMethodHandler, err
- }
|