func callRpcService(service string, operation string, async bool, failOnErr bool, cr *myStartup.GetUserDataRequest, rep *myStartup.GetUserDataResponse) (err os.Error) { defer skylib.CheckError(&err) rpcClient, err := skylib.GetRandomClientByService(service) if err != nil { log.Println("No service provides", service) if failOnErr { return skylib.NewError(skylib.NO_CLIENT_PROVIDES_SERVICE, service) } else { return nil } } name := service + operation if async { go rpcClient.Call(name, cr, rep) log.Println("Called service async", name) return nil } log.Println("Calling : " + name) err = rpcClient.Call(name, cr, rep) if err != nil { log.Println("failed connection, retrying", err) // get another one and try again! rpcClient, err := skylib.GetRandomClientByService(service) err = rpcClient.Call(name, cr, rep) if err != nil { return skylib.NewError(err.String(), name) } } log.Println("Called service operation sync", name) return nil }
// Service operation for RPC. func (rs *RouteService) RouteGetUserDataRequest(cr *myStartup.GetUserDataRequest, rep *myStartup.GetUserDataResponse) (err os.Error) { defer skylib.CheckError(&err) log.Println(route) for i := 0; i < route.RouteList.Len(); i++ { rpcCall := route.RouteList.At(i).(map[string]interface{}) err := callRpcService(rpcCall["Service"].(string), rpcCall["Operation"].(string), rpcCall["Async"].(bool), rpcCall["ErrOnFail"].(bool), cr, rep) if err != nil { skylib.Errors.Add(1) return err } } skylib.Requests.Add(1) return nil }