diff --git a/example/main.go b/example/main.go index f668994..4b13be6 100644 --- a/example/main.go +++ b/example/main.go @@ -136,7 +136,7 @@ func (slf *TestServiceCall) Test(){ func (slf *TestServiceCall) Run(){ //var ret int - var input int = 1000000 + var input int = 1 //bT := time.Now() // 开始时间 //err := slf.Call("TestServiceCall.RPC_Test",&ret,&input) @@ -149,9 +149,12 @@ func (slf *TestServiceCall) Run(){ if param.Index == 0 { fmt.Print(".......................\n") } - slf.AsyncCall("TestService1.RPC_Test",¶m, func(reply *Param, err error) { + err := slf.AsyncCall("TestService1.RPC_Test",¶m, func(reply *Param, err error) { log.Debug(" index %d ,err %+v",reply.Index,err) }) + if err != nil { + fmt.Printf("x333333333333:%+v",err) + } } @@ -167,13 +170,13 @@ func (slf *TestService1) RPC_Test(a *Param,b *Param) error { func (slf *TestService1) OnInit() error { return nil } - +/* func (slf *TestServiceCall) RPC_Test(a *int,b *int) error { fmt.Printf("TestService2\n") *a = *b return nil } - +*/ func (slf *TestServiceCall) TestDB() { assetsInfo := &struct { Cash int64 `json:"cash"` //美金余额 100 diff --git a/rpc/client.go b/rpc/client.go index c874768..862c220 100644 --- a/rpc/client.go +++ b/rpc/client.go @@ -130,7 +130,7 @@ func (slf *Client) Go(noReply bool,mutiCoroutine bool,serviceMethod string, args return call } -type RequestHandler func(Returns interface{},Err error) +type RequestHandler func(Returns interface{},Err *RpcError) type RpcRequest struct { //packhead @@ -151,7 +151,7 @@ type RpcRequest struct { type RpcResponse struct { //head Seq uint64 // sequence number chosen by client - Err error + Err *RpcError //returns Returns []byte @@ -189,6 +189,9 @@ func (slf *Client) Run(){ v.Err = err } } + if respone.Err != nil { + v.Err= respone.Err + } if v.callback.IsValid() { diff --git a/rpc/rpchandler.go b/rpc/rpchandler.go index 9a36551..828a8a2 100644 --- a/rpc/rpchandler.go +++ b/rpc/rpchandler.go @@ -13,6 +13,31 @@ type FuncRpcClient func(nodeid int,serviceMethod string) ([]*Client,error) type FuncRpcServer func() (*Server) var NilError = reflect.Zero(reflect.TypeOf((*error)(nil)).Elem()) +type RpcError struct { + Err string +} + +func (slf *RpcError) Error() string { + return slf.Err +} + +func NewRpcError(e string) *RpcError { + return &RpcError{Err:e} +} + +func ConvertError(e error) *RpcError{ + if e == nil { + return nil + } + + return &RpcError{Err:e.Error()} +} + +func Errorf(format string, a ...interface{}) *RpcError { + return NewRpcError(fmt.Sprintf(format,a...)) +} + + type RpcMethodInfo struct { method reflect.Method iparam interface{} @@ -157,10 +182,11 @@ func (slf *RpcHandler) HandlerRpcResponeCB(call *Call){ } + func (slf *RpcHandler) HandlerRpcRequest(request *RpcRequest) { v,ok := slf.mapfunctons[request.ServiceMethod] if ok == false { - err := fmt.Errorf("RpcHandler %s cannot find %s",slf.rpcHandler.GetName(),request.ServiceMethod) + err := Errorf("RpcHandler %s cannot find %s",slf.rpcHandler.GetName(),request.ServiceMethod) log.Error("%s",err.Error()) if request.requestHandle!=nil { request.requestHandle(nil,err) @@ -174,7 +200,7 @@ func (slf *RpcHandler) HandlerRpcRequest(request *RpcRequest) { if request.localParam==nil{ err = processor.Unmarshal(request.InParam,&v.iparam) if err!=nil { - rerr := fmt.Errorf("Call Rpc %s Param error %+v",request.ServiceMethod,err) + rerr := Errorf("Call Rpc %s Param error %+v",request.ServiceMethod,err) log.Error("%s",rerr.Error()) if request.requestHandle!=nil { request.requestHandle(nil, rerr) @@ -199,7 +225,7 @@ func (slf *RpcHandler) HandlerRpcRequest(request *RpcRequest) { } if request.requestHandle!=nil { - request.requestHandle(oParam.Interface(), err) + request.requestHandle(oParam.Interface(), ConvertError(err)) } } diff --git a/rpc/server.go b/rpc/server.go index 633091f..828049b 100644 --- a/rpc/server.go +++ b/rpc/server.go @@ -120,15 +120,19 @@ func (agent *RpcAgent) Run() { continue } if req.NoReply == false { - req.requestHandle = func(Returns interface{},Err error){ + req.requestHandle = func(Returns interface{},Err *RpcError){ var rpcRespone RpcResponse rpcRespone.Seq = req.Seq rpcRespone.Err = Err if Err==nil { - rpcRespone.Returns,rpcRespone.Err = processor.Marshal(Returns) + rpcRespone.Returns,err = processor.Marshal(Returns) + if err!= nil { + rpcRespone.Err = ConvertError(err) + } + //rpcRespone.Returns, = processor.Marshal(Returns) } - bytes,err := processor.Marshal(rpcRespone) + bytes,err := processor.Marshal(&rpcRespone) if err != nil { log.Error("service method %s Marshal error:%+v!", req.ServiceMethod,err) return @@ -208,7 +212,7 @@ func (slf *Server) rpcHandlerGo(noReply bool,mutiCoroutine bool,handlerName stri req.NoReply = noReply if noReply == false { - req.requestHandle = func(Returns interface{},Err error){ + req.requestHandle = func(Returns interface{},Err *RpcError){ pCall.Err = Err pCall.done <- pCall } @@ -244,7 +248,7 @@ func (slf *Server) rpcHandlerAsyncGo(callerRpcHandler IRpcHandler,noReply bool,m req.MutiCoroutine = mutiCoroutine if noReply == false { - req.requestHandle = func(Returns interface{},Err error){ + req.requestHandle = func(Returns interface{},Err *RpcError){ pCall.Err = Err if Returns!=nil { pCall.Reply = Returns