mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-14 20:59:53 +05:00
better reflection client/worker
This commit is contained in:
@@ -116,7 +116,12 @@ func main() {
|
||||
}
|
||||
case "status":
|
||||
var result string
|
||||
if err = client.Call("Responder.Status", cd, &result); err == nil {
|
||||
if err = client.Call("Responder.Status", "", &result); err == nil {
|
||||
fmt.Println(result)
|
||||
}
|
||||
case "shutdown":
|
||||
var result string
|
||||
if err = client.Call("Responder.Shutdown", "", &result); err == nil {
|
||||
fmt.Println(result)
|
||||
}
|
||||
default:
|
||||
@@ -128,6 +133,7 @@ func main() {
|
||||
fmt.Println("\tdebitseconds")
|
||||
fmt.Println("\tresetuserbudget")
|
||||
fmt.Println("\tstatus")
|
||||
fmt.Println("\tshutdown")
|
||||
flag.PrintDefaults()
|
||||
}
|
||||
if err != nil {
|
||||
|
||||
@@ -160,6 +160,11 @@ func main() {
|
||||
rater_enabled = false
|
||||
rater_standalone = false
|
||||
}
|
||||
if !rater_enabled && !balancer_enabled {
|
||||
rater_enabled = true
|
||||
rater_standalone = true
|
||||
}
|
||||
|
||||
getter, err := timespans.NewRedisStorage(redis_server, redis_db)
|
||||
if err != nil {
|
||||
timespans.Logger.Crit("Could not connect to redis, exiting!")
|
||||
@@ -183,7 +188,7 @@ func main() {
|
||||
go listenToRPCRequests(responder, balancer_listen_api, balancer_json)
|
||||
go listenToHttpRequests()
|
||||
if !balancer_standalone {
|
||||
bal.AddClient("local", ×pans.ResponderWorker{×pans.Responder{ExitChan: exitChan}})
|
||||
bal.AddClient("local", new(timespans.ResponderWorker))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -38,15 +38,12 @@ type Responder struct {
|
||||
RPC method thet provides the external RPC interface for getting the rating information.
|
||||
*/
|
||||
func (rs *Responder) GetCost(arg CallDescriptor, reply *CallCost) (err error) {
|
||||
log.Print("Ready: ", rs.Bal)
|
||||
if rs.Bal != nil {
|
||||
r, e := rs.getCallCost(&arg, "Responder.GetCost")
|
||||
*reply, err = *r, e
|
||||
} else {
|
||||
log.Print("1", arg.GetUserBalanceKey())
|
||||
r, e := AccLock.GuardGetCost(arg.GetUserBalanceKey(), func() (*CallCost, error) {
|
||||
log.Print("here", arg)
|
||||
return (&arg).GetCost()
|
||||
return arg.GetCost()
|
||||
})
|
||||
*reply, err = *r, e
|
||||
}
|
||||
@@ -59,7 +56,7 @@ func (rs *Responder) Debit(arg CallDescriptor, reply *CallCost) (err error) {
|
||||
*reply, err = *r, e
|
||||
} else {
|
||||
r, e := AccLock.GuardGetCost(arg.GetUserBalanceKey(), func() (*CallCost, error) {
|
||||
return (&arg).Debit()
|
||||
return arg.Debit()
|
||||
})
|
||||
*reply, err = *r, e
|
||||
}
|
||||
@@ -71,7 +68,7 @@ func (rs *Responder) DebitCents(arg CallDescriptor, reply *float64) (err error)
|
||||
*reply, err = rs.callMethod(&arg, "Responder.DebitCents")
|
||||
} else {
|
||||
r, e := AccLock.Guard(arg.GetUserBalanceKey(), func() (float64, error) {
|
||||
return (&arg).DebitCents()
|
||||
return arg.DebitCents()
|
||||
})
|
||||
*reply, err = r, e
|
||||
}
|
||||
@@ -83,7 +80,7 @@ func (rs *Responder) DebitSMS(arg CallDescriptor, reply *float64) (err error) {
|
||||
*reply, err = rs.callMethod(&arg, "Responder.DebitSMS")
|
||||
} else {
|
||||
r, e := AccLock.Guard(arg.GetUserBalanceKey(), func() (float64, error) {
|
||||
return (&arg).DebitSMS()
|
||||
return arg.DebitSMS()
|
||||
})
|
||||
*reply, err = r, e
|
||||
}
|
||||
@@ -95,7 +92,7 @@ func (rs *Responder) DebitSeconds(arg CallDescriptor, reply *float64) (err error
|
||||
*reply, err = rs.callMethod(&arg, "Responder.DebitSeconds")
|
||||
} else {
|
||||
r, e := AccLock.Guard(arg.GetUserBalanceKey(), func() (float64, error) {
|
||||
return 0, (&arg).DebitSeconds()
|
||||
return 0, arg.DebitSeconds()
|
||||
})
|
||||
*reply, err = r, e
|
||||
}
|
||||
@@ -107,7 +104,7 @@ func (rs *Responder) GetMaxSessionTime(arg CallDescriptor, reply *float64) (err
|
||||
*reply, err = rs.callMethod(&arg, "Responder.GetMaxSessionTime")
|
||||
} else {
|
||||
r, e := AccLock.Guard(arg.GetUserBalanceKey(), func() (float64, error) {
|
||||
return (&arg).GetMaxSessionTime()
|
||||
return arg.GetMaxSessionTime()
|
||||
})
|
||||
*reply, err = r, e
|
||||
}
|
||||
@@ -120,14 +117,14 @@ func (rs *Responder) AddRecievedCallSeconds(arg CallDescriptor, reply *float64)
|
||||
} else {
|
||||
|
||||
r, e := AccLock.Guard(arg.GetUserBalanceKey(), func() (float64, error) {
|
||||
return 0, (&arg).AddRecievedCallSeconds()
|
||||
return 0, arg.AddRecievedCallSeconds()
|
||||
})
|
||||
*reply, err = r, e
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (rs *Responder) Status(arg CallDescriptor, reply *string) (err error) {
|
||||
func (rs *Responder) Status(arg string, reply *string) (err error) {
|
||||
memstats := new(runtime.MemStats)
|
||||
runtime.ReadMemStats(memstats)
|
||||
if rs.Bal != nil {
|
||||
@@ -201,22 +198,35 @@ func (rs *Responder) callMethod(key *CallDescriptor, method string) (reply float
|
||||
return
|
||||
}
|
||||
|
||||
type ResponderWorker struct {
|
||||
R *Responder
|
||||
}
|
||||
type ResponderWorker struct{}
|
||||
|
||||
func (rw *ResponderWorker) Call(serviceMethod string, args interface{}, reply interface{}) error {
|
||||
log.Printf("Calling by reflection: %v %v", strings.TrimLeft(serviceMethod, "Responder."), reply)
|
||||
methodName := strings.TrimLeft(serviceMethod, "Responder.")
|
||||
switch args.(type) {
|
||||
case CallDescriptor:
|
||||
cd := args.(CallDescriptor)
|
||||
switch reply.(type) {
|
||||
case *CallCost:
|
||||
rep := reply.(*CallCost)
|
||||
method := reflect.ValueOf(&cd).MethodByName(methodName)
|
||||
ret := method.Call([]reflect.Value{})
|
||||
*rep = *(ret[0].Interface().(*CallCost))
|
||||
case *float64:
|
||||
rep := reply.(*float64)
|
||||
method := reflect.ValueOf(&cd).MethodByName(methodName)
|
||||
ret := method.Call([]reflect.Value{})
|
||||
*rep = *(ret[0].Interface().(*float64))
|
||||
}
|
||||
case string:
|
||||
switch methodName {
|
||||
case "Status":
|
||||
*(reply.(*string)) = "Local!"
|
||||
case "Shutdown":
|
||||
*(reply.(*string)) = "Done!"
|
||||
}
|
||||
|
||||
method := reflect.ValueOf(rw.R).MethodByName(strings.TrimLeft(serviceMethod, "Responder."))
|
||||
r := method.Call([]reflect.Value{reflect.ValueOf(args), reflect.ValueOf(reply)})
|
||||
|
||||
response := r[0].Interface()
|
||||
log.Printf("Called: %v %v", reply, response)
|
||||
if response == nil {
|
||||
return nil
|
||||
}
|
||||
return response.(error)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (rw *ResponderWorker) Close() error {
|
||||
|
||||
Reference in New Issue
Block a user