Skip to content
Snippets Groups Projects
Commit 19398a55 authored by fangyincheng's avatar fangyincheng
Browse files

Imp:support lowercase function on the provider

parent 22b31aee
No related branches found
No related tags found
No related merge requests found
......@@ -40,6 +40,12 @@ type RPCService interface {
Version() string
}
// for lowercase func
// func MethodMapper() map[string][string] {
// return map[string][string]{}
// }
const METHOD_MAPPER = "MethodMapper"
var (
// Precompute the reflect type for error. Can't use error directly
// because Typeof takes an empty interface value. This is annoying.
......@@ -210,20 +216,26 @@ func isExportedOrBuiltinType(t reflect.Type) bool {
// suitableMethods returns suitable Rpc methods of typ
func suitableMethods(typ reflect.Type) (string, map[string]*MethodType) {
methods := make(map[string]*MethodType)
mts := ""
var mts []string
logger.Debugf("[%s] NumMethod is %d", typ.String(), typ.NumMethod())
method, ok := typ.MethodByName(METHOD_MAPPER)
var methodMapper map[string]string
if ok && method.Type.NumIn() == 1 && method.Type.NumOut() == 1 && method.Type.Out(0).String() == "map[string]string" {
methodMapper = method.Func.Call([]reflect.Value{reflect.New(typ.Elem())})[0].Interface().(map[string]string)
}
for m := 0; m < typ.NumMethod(); m++ {
method := typ.Method(m)
method = typ.Method(m)
if mt := suiteMethod(method); mt != nil {
methods[method.Name] = mt
if m == 0 {
mts += method.Name
} else {
mts += "," + method.Name
methodName, ok := methodMapper[method.Name]
if !ok {
methodName = method.Name
}
methods[methodName] = mt
mts = append(mts, methodName)
}
}
return mts, methods
return strings.Join(mts, ","), methods
}
// suiteMethod returns a suitable Rpc methodType
......
......@@ -42,6 +42,11 @@ func (s *TestService) Service() string {
func (s *TestService) Version() string {
return ""
}
func (s *TestService) MethodMapper() map[string]string {
return map[string]string{
"MethodTwo": "methodTwo",
}
}
type testService struct {
}
......@@ -87,7 +92,7 @@ func TestServiceMap_Register(t *testing.T) {
s := &TestService{}
methods, err = ServiceMap.Register("testporotocol", s)
assert.NoError(t, err)
assert.Equal(t, "MethodOne,MethodTwo", methods)
assert.Equal(t, "MethodOne,methodTwo", methods)
// repeat
methods, err = ServiceMap.Register("testporotocol", s)
......
......@@ -93,14 +93,14 @@ func main() {
}
println("response result: %v", ret1)
println("\n\n\nstart to test dubbo - getUser2")
println("\n\n\nstart to test dubbo - getUser")
user = &User{}
err = userProvider.GetUser2(context.TODO(), []interface{}{1}, user)
var i int32 = 1
err = userProvider.GetUser2(context.TODO(), []interface{}{i}, user)
if err != nil {
println("getUser - error: %v", err)
} else {
println("response result: %v", user)
panic(err)
}
println("response result: %v", user)
println("\n\n\nstart to test dubbo - getErr")
user = &User{}
......
......@@ -130,6 +130,14 @@ func (u *UserProvider) getUser(userId string) (*User, error) {
return nil, fmt.Errorf("invalid user id:%s", userId)
}
func (u *UserProvider) GetUser2(ctx context.Context, req []interface{}, rsp *User) error {
var err error
println("req:%#v", req)
rsp.Id = strconv.Itoa(int(req[0].(int32)))
return err
}
func (u *UserProvider) GetUser(ctx context.Context, req []interface{}, rsp *User) error {
var (
err error
......@@ -182,6 +190,12 @@ func (u *UserProvider) GetUsers(req []interface{}) ([]interface{}, error) {
return []interface{}{user, user1}, err
}
func (s *UserProvider) MethodMapper() map[string]string {
return map[string]string{
"GetUser2": "getUser",
}
}
func (u *UserProvider) Service() string {
return "com.ikurento.user.UserProvider"
}
......
......@@ -51,6 +51,10 @@ public class Consumer {
System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " +
" UserInfo, Id:" + user2.getId() + ", name:" + user2.getName() + ", sex:" + user2.getSex().toString()
+ ", age:" + user2.getAge() + ", time:" + user2.getTime().toString());
User user3 = userProvider.getUser(1);
System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " +
" UserInfo, Id:" + user3.getId() + ", name:" + user3.getName() + ", sex:" + user3.getSex().toString()
+ ", age:" + user3.getAge() + ", time:" + user3.getTime().toString());
User user9 = userProvider.GetUser1("A003");
} catch (Exception e) {
......
......@@ -22,6 +22,7 @@ public interface UserProvider {
User GetUser(String userId);
User GetErr(String userId) throws Exception;
User GetUser1(String userId);
User getUser(int usercode);
List<User> GetUsers(List<String> userIdList);
User GetUser0(String userId, String name);
......
......@@ -90,10 +90,9 @@ func main() {
user = &JsonRPCUser{}
err = userProvider.GetUser2(context.TODO(), []interface{}{1}, user)
if err != nil {
println("getUser - error: %v", err)
} else {
println("response result: %v", user)
panic(err)
}
println("response result: %v", user)
println("\n\n\nstart to test jsonrpc illegal method")
err = userProvider.GetUser1(context.TODO(), []interface{}{"A003"}, user)
......
......@@ -20,6 +20,7 @@ package main
import (
"context"
"fmt"
"strconv"
"time"
)
......@@ -127,6 +128,15 @@ func (u *UserProvider) GetUser0(id string, name string) (User, error) {
return *user, err
}
func (u *UserProvider) GetUser2(ctx context.Context, req []interface{}, rsp *User) error {
var err error
println("req:%#v", req)
rsp.Id = strconv.FormatFloat(req[0].(float64), 'f', 0, 64)
rsp.Sex = Gender(MAN).String()
return err
}
func (u *UserProvider) GetUsers(req []interface{}) ([]User, error) {
var err error
......@@ -146,6 +156,12 @@ func (u *UserProvider) GetUsers(req []interface{}) ([]User, error) {
return []User{*user, *user1}, err
}
func (s *UserProvider) MethodMapper() map[string]string {
return map[string]string{
"GetUser2": "getUser",
}
}
func (u *UserProvider) Service() string {
return "com.ikurento.user.UserProvider"
}
......
......@@ -55,6 +55,10 @@ public class Consumer {
System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " +
" UserInfo, Id:" + user2.getId() + ", name:" + user2.getName() + ", sex:" + user2.getSex().toString()
+ ", age:" + user2.getAge() + ", time:" + user2.getTime().toString());
User user3 = userProvider.getUser(1);
System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " +
" UserInfo, Id:" + user3.getId() + ", name:" + user3.getName() + ", sex:" + user3.getSex().toString()
+ ", age:" + user3.getAge() + ", time:" + user3.getTime().toString());
} catch (Exception e) {
e.printStackTrace();
}
......
......@@ -20,6 +20,7 @@ import java.util.List;
public interface UserProvider {
User GetUser(String userId);
User getUser(int usercode);
List<User> GetUsers(List<String> userIdList);
User GetUser0(String userId, String name);
......
......@@ -268,13 +268,13 @@ func (h *RpcServerHandler) callService(req *DubboPackage, ctx context.Context) {
if e := recover(); e != nil {
req.Header.ResponseStatus = hessian.Response_SERVER_ERROR
if err, ok := e.(error); ok {
logger.Errorf("callService panic: %#v", err)
logger.Errorf("callService panic: %+v", err)
req.Body = perrors.WithStack(err)
} else if err, ok := e.(string); ok {
logger.Errorf("callService panic: %#v", perrors.New(err))
logger.Errorf("callService panic: %+v", perrors.New(err))
req.Body = perrors.New(err)
} else {
logger.Errorf("callService panic: %#v, this is impossible.", e)
logger.Errorf("callService panic: %+v, this is impossible.", e)
req.Body = e
}
}
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment