抓到 Dubbo 异步调用的小 Bug,再送你一个贡献开源代码的机会

本文介绍了在 Dubbo 中遇到的一个异步调用问题,当接口返回类型为 boolean 时,从同步切换到异步会返回错误的结果。通过分析源码,发现问题出在 Dubbo 的异步调用处理逻辑上,当返回值为基本类型时,会错误地返回 false。修复方案是在代码中添加判断,避免在非 injvm 调用时出现问题。这是一个学习 Dubbo 源码和提交开源项目 PR 的好机会。
摘要由CSDN通过智能技术生成

问题复现

今天发现一个问题 有一个 dubbo 接口返回类型是 boolean。把接口从同步改成异步 server 端返回 true,消费端却返回 false。把 boolean 改成 Boolean 就能正常返回结果。有碰到过这个问题吗?

注意几个重点:

  • 接口返回类型是 boolean;

  • 同步改为异步调用,返回的 boolean 和预期不符合;

  • boolean 基本类型改成包装类型 Boolean 就能正常返回。

《Java开发手册》中就强调了 RPC 接口返回最好不要使用基本类型,而要使用包装类型:

知道怎么写的就好办了,写个 Demo 先:

1) 定义 Dubbo 接口,一个返回 boolean,一个返回 Boolean。

public interface DemoService {
  
    boolean isUser();
    Boolean isFood();
}

2) 实现 Provider,为了简单,都返回 true,并且打了日志。

@Service
public class DemoServiceImpl implements DemoService {
  


    @Override
    public boolean isUser() {
  
        System.out.println("server is user : true");
        return true;
    }


    @Override
    public Boolean isFood() {
  
        System.out.println("server is food : true");
        return true;
    }
}

3) 实现 Consumer。

为了方便调用,实现了一个 Controller,为了防止本机调用,injvm 设置为 false。这里是经验,injvm 调用逻辑和远程调用区别挺大,为了防止干扰,统一远程调用。

@RestController
public class DemoCallerService {
  


    @Reference(injv
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值