问题描述:
开发时碰到了一个这种问题:在类中定义了三个boolean类型的成员变量,这个类是Dubbo的服务实现类,也就是在类上使用DubboService注解的类,笔者在这个类里面声明了三个boolean类型的成员变量,默认初始值都是false,但是当程序进入到方法以后,还没开始操作这三个变量,其中有两个就变成了true,然后笔者不得不在方法内从新给他们初始化一次,因为这个问题导致了程序的流程出现了问题,因为笔者是使用他们来控制一个流程走向的。
问题分析:
Dubbo是通过注册中心找到我们提供的服务,根据的是版本号和接口类型,那么找到笔者所写的服务类是没有问题的,但是就是没有初始化这些成员变量,但是dubbo容器肯定是对服务类进行初始化过了啊,这个很让人费解,虽说这么使用成员变量不太雅观,但只要正常初始化的对象,再调用成员方法,这个变量就该是false啊。
解决方法:
在使用前再次初始化或者将成员变量变成类变量,这样就可以解决问题,这个问题看着是一个未初始化问题,或者说是初始化出现了问题,先在此记录,防止再犯,以后研究dubbo源码再来深入看此问题。如有高见还望路过的兄台不吝赐教。
问题代码展示:
@DubboService(version = CommonConstant.SGCC_PROVIDER_VERSION) @Slf4j public class SupplierIndustrialCloudServiceImpl implements SupplierIndustrialCloudService { Boolean flag1 = false; Boolean flag2 = false; Boolean flag3 = false; /** * 0,审核通过,1审核拒绝,2待审核,3无其他产线数据,4其他场景(比如异常) * @param params * @return */ @Override public Integer ifDoubleSettled(String params) { flag1 = flag1 = flag1 = false;//这一行是发现问题后加入的 String unified = JsonUtil.getString(params,"unifiedSocietyCreditCode"); String bizUserId = JsonUtil.getString(params,"bizUserId"); //此处条件不能加产线,要支持产线内的二次入住 String sql = "SELECT " + " c.audit_result " + "FROM " + " supplier_settled_common a " + "LEFT JOIN supplier_settled_biz b ON a.oid = b.settled_common_oid " + "LEFT JOIN supplier_settled_biz_audit c ON b.oid = c.settled_biz_oid " + "where a.unified_society_credit_code = '"+unified+"' " + "and b.biz_supplier_code <> '"+bizUserId+"'"; log.info("sql:"+sql); QueryPacker queryPacker = QueryPacker.create(TableConstant.TABLE_SETTLED_COMMON); queryPacker.setmSql(sql); ResponseModel<PageResult> responseModel = queryPersistenceCoreService.queryData(CommonConstant.APPKEY, queryPacker, CommonConstant.SOURCE); log.info("##############################dao层调用数据中台返回结果:" + responseModel + "##############################"); if (!responseModel.isSuccess()) { return new Integer(4); } else { /** * 此处逻辑: * 1).若是存在已审核通过的数据,无论有没有审核拒绝和未审核的数据都返回审核通过。 * 2).若是不存在审核通过,存在审核拒绝的数据,无论有没有待审核,都返回审核拒绝 * 3).若是不存在审核通过和拒绝的数据,则返回待审核 */ if(responseModel.getData().getResultList()!=null && responseModel.getData().getResultList().size()>0){ List<Map<String,Object>> listMap = responseModel.getData().getResultList(); listMap.stream().forEach(map ->{ if(((String)map.get("audit_result")).equals("1")) flag1 = true; else if(((String)map.get("audit_result")).equals("2")) flag2 = true; else flag3 = true; }); if(flag2){ //存在审核通过数据 return new Integer(0); } if(flag3) //存在审核拒绝数据 return new Integer(1); //存在待审核数据 return new Integer(2);//审核状态只有三种情况,所以此处可直接返回 }else{ //不存在其他产线数据 return new Integer(3); } } } }