youngyangyang04 / RPC-Java

【代码随想录知识星球】项目分享-手撕RPC框架🔥
186 stars 39 forks source link

guavaRetry模块出现问题 #13

Open morehair opened 1 month ago

morehair commented 1 month ago

我在TestClient.java里用for循环创建10个以上线程同时向服务器发送请求时会抛出几个异常,似乎是客户端的请求得到了空的返回结果 尤其是后面的线程在执行到guavaRetry.java的

.retryIfResult(response -> Objects.equals(response.getCode(), 500))

这行代码时会抛出异常 java.lang.NullPointerException: Cannot invoke "part1.common.Message.RpcResponse.getCode()" because "response" is null 然后retryer不会进行下一次重试了,控制台输出也只有RetryListener: 第1次调用 没有第二次和第三次 我把代码改成

.retryIfResult(response -> response == null || Objects.equals(response.getCode(), 500))

之后才能正常进行下一次重试 请问这是代码的问题还是我运行方式有问题

public class TestClient {
    public static void main(String[] args) throws InterruptedException {
        ClientProxy clientProxy=new ClientProxy();
        UserService proxy=clientProxy.getProxy(UserService.class);
        for(int i = 0; i < 15; i++) {
            Integer i1 = i;
            new Thread(()->{
                try{
                    User user = proxy.getUserByUserId(i1);

                    System.out.println("从服务端得到的user="+user.toString());

                    Integer id = proxy.insertUserId(User.builder().id(i1).userName("User" + i1.toString()).sex(true).build());
                    System.out.println("向服务端插入user的id"+id);
                } catch (NullPointerException e){
                    System.out.println("user为空");
                    e.printStackTrace();
                }
            }).start();
            }
        }
//        User u=User.builder().id(100).userName("wxx").sex(true).build();
//        Integer id = proxy.insertUserId(u);
//        System.out.println("向服务端插入user的id"+id);
}

微信图片_20240725144009

GGBoooond commented 1 month ago

您好!很高兴你能发现这里存在的问题。在经过排查后,发现这里的问题在于当 并发请求之后,Server端的限流器生效,限流返回Fail Response ,但在解码器decoder中对fail response的解码不正确,需要添加解码逻辑。这个问题我将于今晚尽快修复

Qi18 commented 1 month ago
截屏2024-07-27 15 32 40

json序列化的生成dataType的部分应该加一个data为空的判断