问题记录:Dubbo服务实现类的成员变量未初始化问题

简介: 开发时碰到了一个这种问题:在类中定义了三个boolean类型的成员变量,这个类是Dubbo的服务实现类,也就是在类上使用DubboService注解的类,笔者在这个类里面声明了三个boolean类型的成员变量,默认初始值都是false,但是当程序进入到方法以后,还没开始操作这三个变量,其中有两个就变成了true,然后笔者不得不在方法内从新给他们初始化一次,因为这个问题导致了程序的流程出现了问题,因为笔者是使用他们来控制一个流程走向的。

问题描述:



开发时碰到了一个这种问题:在类中定义了三个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);
            }
        }
    }
 }   
相关文章
|
7月前
|
XML Dubbo Java
【Dubbo3高级特性】「框架与服务」服务的异步调用实践以及开发模式
【Dubbo3高级特性】「框架与服务」服务的异步调用实践以及开发模式
159 0
|
2月前
|
监控 Dubbo Java
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
这篇文章详细介绍了如何将Spring Boot与Dubbo和Zookeeper整合,并通过Dubbo管理界面监控服务注册情况。
97 0
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
|
4月前
|
JSON Dubbo Java
【Dubbo协议指南】揭秘高性能服务通信,选择最佳协议的终极攻略!
【8月更文挑战第24天】在分布式服务架构中,Apache Dubbo作为一款高性能的Java RPC框架,支持多种通信协议,包括Dubbo协议、HTTP协议及Hessian协议等。Dubbo协议是默认选择,采用NIO异步通讯,适用于高要求的内部服务通信。HTTP协议通用性强,利于跨语言调用;Hessian协议则在数据传输效率上有优势。选择合适协议需综合考虑性能需求、序列化方式、网络环境及安全性等因素。通过合理配置,可实现服务性能最优化及系统可靠性提升。
60 3
|
4月前
|
缓存 Dubbo Java
Dubbo服务消费者启动与订阅原理
该文章主要介绍了Dubbo服务消费者启动与订阅的原理,包括服务消费者的启动时机、启动过程以及订阅和感知最新提供者信息的方式。
Dubbo服务消费者启动与订阅原理
|
4月前
|
Dubbo 网络协议 Java
深入掌握Dubbo服务提供者发布与注册原理
该文章主要介绍了Dubbo服务提供者发布与注册的原理,包括服务发布的流程、多协议发布、构建Invoker、注册到注册中心等过程。
深入掌握Dubbo服务提供者发布与注册原理
|
4月前
|
负载均衡 Dubbo Java
Dubbo服务Spi机制和原理
该文章主要介绍了Dubbo中的SPI(Service Provider Interface)机制和原理,包括SPI的基本概念、Dubbo中的SPI分类以及SPI机制的实现细节。
Dubbo服务Spi机制和原理
|
4月前
|
C# 开发者 Windows
勇敢迈出第一步:手把手教你如何在WPF开源项目中贡献你的第一行代码,从选择项目到提交PR的全过程解析与实战技巧分享
【8月更文挑战第31天】本文指导您如何在Windows Presentation Foundation(WPF)相关的开源项目中贡献代码。无论您是初学者还是有经验的开发者,参与这类项目都能加深对WPF框架的理解并拓展职业履历。文章推荐了一些适合入门的项目如MvvmLight和MahApps.Metro,并详细介绍了从选择项目、设置开发环境到提交代码的全过程。通过具体示例,如添加按钮点击事件处理程序,帮助您迈出第一步。此外,还强调了提交Pull Request时保持专业沟通的重要性。参与开源不仅能提升技能,还能促进社区交流。
46 0
|
6月前
|
Dubbo 前端开发 Java
Dubbo3 服务原生支持 http 访问,兼具高性能与易用性
本文展示了 Dubbo3 triple 协议是如何简化从协议规范与实现上简化开发测试、入口流量接入成本的,同时提供高性能通信、面向接口的易用性编码。
16643 13
|
4月前
|
缓存 负载均衡 Dubbo
Dubbo服务集群容错原理(重要)
该文章主要介绍了Dubbo服务集群容错的原理,包括集群容错技术的概念、Dubbo中使用的集群容错技术种类及其原理。
|
4月前
|
负载均衡 Dubbo 算法
Dubbo服务负载均衡原理
该文章主要介绍了Dubbo服务负载均衡的原理,包括Dubbo中负载均衡的实现位置、为什么需要负载均衡机制、Dubbo支持的负载均衡算法以及随机负载均衡策略的源码分析。