润普挂卷失败之老卷宗对接NP无法获取案件信息问题排查
润普挂卷失败之老卷宗对接NP无法获取案件信息问题排查
写在最前面
根因:NP的dzjzzzfw与老卷宗dzjz服务用的zookeeper不是同一个,且老卷宗指向的zookeeper没有任何一个匹配的dzjzzzfw。仅有消费者,没有任何生产者,导致老卷宗通过dubbo获取案件信息失败。
非以下情况本文基本不具有参考价值,可不继续观看
- 润普通过老卷宗挂卷,且堆栈错误明确指向获取案件信息空指针
- 老卷宗刷新卷宗失败,且堆栈错误明确指向获取案件信息空指针
- 非卷宗服务,但使用了zookeeper、dubbo组件,且堆栈错误明确指向获取服务提供者空指针
问题现象
现场反馈润普所有案件均挂卷失败,从润普提供的信息来看,润普调用多个案件多个接口,老卷宗均返回了:{“code”:201,“compressData”:false,“message”:“接口调用不成功,action【fileXXXAndDirectoryInfoSharedStorage】”,反复重试很多次结果都一样,已经持续几天了,客户着急了,卷宗的研发还在忙别的,正好我在现场,之前也有卷宗问题处理经验,我就先自己上手排查一下吧。
初步排查
根据之前的经验,按照润普提供的接口路径,在老卷宗代码里面找到了对应的接口,但接口中没有润普提供的错误信息,后来在接口的父类com.t.s.c.httpapi.AbstractHttpApi#execute中找到了对应代码
@Overridepublic ApiResult execute(String action, Map<String, String> headers,Map<String, Object> params) {if (action.indexOf('.') > 0) {action = action.substring(action.indexOf('.') + 1);}try {Method method = this.getClass().getDeclaredMethod(action,Map.class, Map.class);method.setAccessible(true);return (ApiResult) method.invoke(this, headers, params);} catch (Exception e) {logger.error(e.getMessage(), e);}return new ApiResult(ApiResultCodeConsts.API_NOT_FOUND这里是201,"接口调用不成功,action【" + action + "】");}
不过这里是通用的报错,并不能直接定位具体问题。还好这里有输出堆栈信息,根据代码路径,去logback.xml中找到对应logger,确认日志输出到了 KaTeX parse error: Expected group after '_' at position 29: …lassifiBusiness_̲{ip}_${port}.log 文件中。
<!-- 忽略不相关内容 --><appender name="rpClassifiBusiness" class="ch.qos.logback.core.rolling.RollingFileAppender"><File>${baseHome}/${appname}_rpClassifiBusiness_${ip}_${port}.log</File><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss:SSS , GMT+8} [%-5level] [%-5thread] [%logger{20}:%line] - %msg%n</pattern><charset>UTF-8</charset></encoder><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>info</level></filter><append>true</append><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${baseHome}/${appname}_rpClassifiBusiness_${ip}_${port}.%d{yyyy-MM-dd}.log.zip</fileNamePattern></rollingPolicy></appender><!-- 忽略不相关内容 --><logger name="com.thunisoft.fy.dzjz.httpapi.ZnfzbaxtHttpApi" level="info" additivity="false"><appender-ref ref="rpClassifiBusiness" /></logger>
跟现场要来了对应日志,并使用调用参数搜索,定位到获取案件信息空指针
2023-02-08 08:39:52:340 [INFO ] [qtp970538683-19221] [c.t.f.d.h.ZnfzbaxtHttpApi:2312] - 从np获取案件信息
2023-02-08 08:39:52:341 [ERROR] [qtp970538683-19221] [c.t.f.d.h.ZnfzbaxtHttpApi:53] - null
java.lang.reflect.InvocationTargetException: nullat sun.reflect.GeneratedMethodAccessor888.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:606)at com.thunisoft.summer.component.httpapi.AbstractHttpApi.execute(AbstractHttpApi.java:51)at com.thunisoft.fy.dzjz.httpapi.DzjzHttpApiServlet.doPost(DzjzHttpApiServlet.java:83)at javax.servlet.http.HttpServlet.service(HttpServlet.java:713)at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:652)... 去掉不相关内容at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException: nullat com.thunisoft.fy.dzjz.httpapi.ZnfzbaxtHttpApi.getAjxx(ZnfzbaxtHttpApi.java:1637)at com.thunisoft.fy.dzjz.httpapi.ZnfzbaxtHttpApi.getSpAjxx(ZnfzbaxtHttpApi.java:2313)at com.thunisoft.fy.dzjz.httpapi.ZnfzbaxtHttpApi.fileClassificationInfoAndDirectoryInfoSharedStorage(ZnfzbaxtHttpApi.java:1879)... 58 common frames omitted
而对应业务代码长下面这样
private CaseInfoBean getAjxx(Long NAjlbs, Integer NFyDm, Integer NAjlb) {BaseInfoBean req = new BaseInfoBean();req.setNAjbs(NAjlbs);req.setNAjlb(NAjlb);req.setNFyid(NFyDm);if (ajxxDubboService == null) {ajxxDubboService = (IAjxxDubboService) ArteryUtil.getBean("ajxxDubboService");}CaseInfoBean ajxx = ajxxDubboService.getAjxx(req); // 这一行报错了。ajxxDubboService类型为com.thunisoft.dzjz.dubbo.ywxtProvider.IAjxxDubboServiceif (ajxx == null) {return null;}return ajxx;}
从上面代码来看,NPE的话,只可能是 ajxxDubboService 这个对象未实例化,而这个对象是使用一个dubbo组件注册到spring里面的,这个逻辑已经用了好多年了,结合以上情况分析,是老卷宗服务和审判系统之间的通道哪儿出问题了。
到这里根据经验,让现场检查dzjzzzfw是否正常,现场说NP研发已经检查过了,服务正常的。然后又想起来,之前好像谁说过老卷宗是有启动顺序要求的,没按照顺序启动可能会导致无法正常调用dzjzzzfw,但我TSTC、ADC、既往卷宗相关文档扒了一圈都没找到哪儿有这个说明,现场也不知道。还好来回换了好几个关键字,一页页扒,最终在TSTC中找到了徐海明明哥的一篇帖子电子卷宗启动方法及FAQ2.2版,里面描述了老卷宗的启动步骤,让现场按照帖子顺序验证,说好像好了,但润普下班了,需要明天验证。
- zookeeper
- …有些跟本文无关的省略了
- dzjzzzfw
- dzjz(老卷宗服务)
第二天一验证,凉凉,问题依旧,报错相同,这???船到桥头自然沉呀,不科学…
再次定位
第二天现场反馈问题依旧,客户又催了,得抓紧搞定了。
既然还不行,那就跟启动顺序没关系了,下一步干啥呢?网上看了下zookeeper、dubbo的一些使用教程,了解到zookeeper是一个服务注册中心,生产者和消费者都是跟注册中心交互,dubbo是一个分布式服务框架,卷宗使用dubbo框架的组件去跟注册中心交互,实现RPC调用。既然消费者初始化失败了,那么我们去注册中心里面看看生产者是否正常吧(在本文中dzjzzzfw就是生产者,dzjz就是消费者)。
记得之前搜过有个zkcli工具可以查看zookeeper服务情况,所以下载这个工具,解压到磁盘,结合网上的教程,连上注册中心,并使用zkcli的ls命令,观察服务情况
# 连接注册中心
E:\xxx\apache-zookeeper-3.8.1-bin\bin\zkCli.cmd -server 131.16.xx.xx:2181
# 查看根路径都有哪些节点
[zk:131.16.xx.xx:2181<CONNECTED> x]ls /
# 输出 [dubbo, zookeeper]
# zookeeper中基本没什么东西,着重看dubbo
[zk:131.16.xx.xx:2181<CONNECTED> x]ls /dubbo
# 这里输出一堆节点,[com.thunisoft.clfx.ajxx.provider.IAjDataDubboService, com.thunisoft.clfx.ajxx.provider.IAjSaveDubboService ... com.thunisoft.summer.component.approve.service.IProcessService]
# 然后查看报错代码类型定义的那个接口是否存在
[zk:131.16.xx.xx:2181<CONNECTED> x]ls /dubbo/com.thunisoft.dzjz.dubbo.ywxtProvider.IAjxxDubboService
# 输出 [configurators, consumers, providers, routers]
# 继续查看消费者
[zk:131.16.xx.xx:2181<CONNECTED> x]ls /dubbo/com.thunisoft.dzjz.dubbo.ywxtProvider.IAjxxDubboService/consumers
# 输出 [consumer%3A%2F%2F131.16.xx.xx%2F...] 代表已经有消费者注册进来了
# 查看生产者
[zk:131.16.xx.xx:2181<CONNECTED> x]ls /dubbo/com.thunisoft.dzjz.dubbo.ywxtProvider.IAjxxDubboService/providers
# 输出 [] 空,从这里分析,应该是生产者没成功注册到zookeeper中
用另一家正常的单位重新走了一遍以上zkCli命令,确认正常的单位中providers列表也是有数据的,所以更加明确,当前问题就是生产者没注册成功,那就看看两边zookeeper配置有没有不同。
要来dzjzzzfw和dzjz两个服务的远程,查看两个服务的配置,发现dzjz(/bin/StartTAS.sh的export ZOOKEEPER_URL参数)及dzjzzzfw(/webapp/WEB-INF/classes/props/config.properties的zookeeper.dzjz.address参数)的zookeeper用的不是同一个。
再次用zkCli连上dzjzzzfw指向的zookeeper,使用 ls /dubbo/com.thunisoft.dzjz.dubbo.ywxtProvider.IAjxxDubboService/providers
命令确认列表不为空,让现场调整后重启验证,确认相关功能正常,功能恢复。
现场为啥这么配置,什么时候改的,不好追溯,不过好在问题最终解决了。整理到这里,后续有类似问题直接来复制代码检查,加快问题处理效率。不过还是希望以后不会遇到这个问题,不然搞了一半天,就是这么一个简单配置问题,还是有点儿浪费资源的。
参考资料
zkCli 下载:
https://dlcdn.apache.org/zookeeper/zookeeper-3.8.1/apache-zookeeper-3.8.1-bin.tar.gz
Zookeeper之zkCli.sh客户端的使用:https://blog.51cto.com/u_12564104/2896709
相关文章:
润普挂卷失败之老卷宗对接NP无法获取案件信息问题排查
润普挂卷失败之老卷宗对接NP无法获取案件信息问题排查 写在最前面 根因:NP的dzjzzzfw与老卷宗dzjz服务用的zookeeper不是同一个,且老卷宗指向的zookeeper没有任何一个匹配的dzjzzzfw。仅有消费者,没有任何生产者,导致老卷宗通过…...
产品经理面试题思考及回答思路(一)
求职产品助理/经理岗位,转行产品岗面试真题 关于产品经理岗位能力的思考: 什么是产品经理?为什么要当/选择做产品经理?怎么理解产品经理?如何理解产品经理的价值?产品日常工作有哪些?工作流程…...
Routability-Driven Macro Placement with Embedded CNN-Based Prediction Model
Routability-Driven Macro Placement with Embedded CNN-Based Prediction Model 2019 Design, Automation & Test in Europe Conference & Exhibition (DATE) DOI: 10.23919/DATE.2019.8715126 目录Abstract一、Introduction二、PROBLEM FORMULATION AND PRELIMINARIE…...
论一个上班族如何一次性通过PMP考试
PMP是我工作后考取的一个证书。从准备到通过,花了大约三个月的时间。我之前在某家互联网公司从事程序员的工作,工作一段时间后,天天敲着代码,改着bug,感觉比较迷茫,不知道未来的发展在哪里,都说…...
Web前端:使用Angular CLI时的最佳实践和专业技巧
在web开发业务中,构建高性能的应用程序是首要因素。此外,用开发人员最流行的语言开发一个健壮的网站将始终为构建高功能的网站提供适当的基础网站。相比之下,不可否认,Angular CLI是建立得最好且正在成长的框架之一。Angular CLI简…...
从0到1一步一步玩转openEuler--15 openEuler使用DNF管理软件包
文章目录15.1 搜索软件包15.2 列出软件包清单15.3 显示RPM包信息15.4 安装RPM包15.5 下载软件包15.6 删除软件包DNF是一款Linux软件包管理工具,用于管理RPM软件包。DNF可以查询软件包信息,从指定软件库获取软件包,自动处理依赖关系以安装或卸…...
【java】Spring Boot --spring boot项目整合xxl-job
文章目录1、源码下载地址2.文档地址3.源码结构4.初始化数据库脚本5.配置调度中心xxl-job-admin5.1 修改调度中心配置文件:/xxl-job/xxl-job-admin/src/main/resources/application.properties5.2 启动调度中心5.3 访问调度中心管理界面6.创建执行器项目6.3 载入配置…...
视图、索引、存储过程、触发器
视图、索引、存储过程、触发器 group by补充: 规范来说,分组查询中,select后的字段只能是group by的字段或者是聚合函数。mysql在这有一个小优化,分组后如果某个字段的所有记录相同,同样可以select。 视图 视图是虚拟…...
ImportError: cannot import name ‘FlattenObservation‘ from ‘gym.wrappers‘ 解决方案
问题描述 今天在运行openai给出的ppo2的baseline的时候遇到了以下bug: File "/root/code/baselines_openai/baselines/common/cmd_util.py", line 12, in <module> from gym.wrappers import FlattenObservation, FilterObservation ImportErr…...
大件传输的9种方法
不知道你有没有试过用电子邮件进行大文件传输,由于文件大小的限制,往往会发送失败。同时,一些文件共享服务对传输的文件有大小限制,使得你无法与朋友分享电影片段或向客户展示你的工作样本。还有一些要求你注册一个账户࿰…...
将vue2的项目《后台管理模式》转变为vue3版本 (一)
本篇主要讲了将v2项目转变为v3版本,以本人经验愿于各位分享 希望大家可以一起交流!!!! 文章目录一、app 出口位置二 、 index.js 路由配置三、package.json 文件四、 main.js 既然安装插件那就需要引入五、 跨域问题总…...
苹果手机怎么下载手机铃声?图文教程,快速学会
很多小伙伴喜欢使用苹果手机,可是苹果手机里的铃声自己并不是很喜欢听,想要下载一些好听的歌曲更换自己的手机铃声。苹果手机怎么下载手机铃声?别着急,今天小编以图文的方式,教教大家如何使用苹果手机下载手机铃声。 苹…...
AJAX笔记(二)Fetch和axios
1、Fetch 1.1、XMLHttpRequest的缺陷 1.2、fetch的get写法 1.3、fetch的post写法 1.4、fetch的put写法 1.5、fetch的patch写法 1.6、fetch的delete写法 2、axios 2.1、axios的介绍 2.2、axios的get写法 2.3、axios的post写法(图一json写法和图二三form写法&#x…...
TOTOLINK NR1800X 系列 CVE 分析
漏洞简介 TOTOLINK NR1800X最近报了一些cve,现主要对其命令注入进行具体分析,以及对其登录绕过进行分析。 固件下载地址:https://www.totolink.net/home/menu/detail/menu_listtpl/download/id/225/ids/36.html 环境搭建 固件提取 binwa…...
IDEA如何将代码进行上下左右移动,改变位置
鼠标光标定位快捷键 1.ctrl Home:定位到一页代码的行头 2.ctrl end :定位到一页代码的行末 3.home:定位到一行的行头 4.end:定位到一行的行末 有的小键盘可能没有home和end键,就需要自行修改IDEA中的快捷键或者使用键盘映射的方法修改。 将…...
【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢
HashMap中为什么引入红黑树,而不是AVL树呢1. 概述 开始学习这个知识点之前我们需要知道,在JDK1.8 以及之前,针对HashMap有什么不同。 JDK 1.7的时候,HashMap的底层实现是数组 链表JDK1.8的时候,HashMap的底层实现是数…...
深度学习Week15-common.py文件解读(YOLOv5)
目录 简介 一.基本组件 1.1autopad 1.2Conv 1.3 Focus 1.4Bottleneck 1.5BottleneckCSP 1.6 C3 1.7 SPP 1.8Concat 1.9Contract、Expand 二、重要类 2.1非极大值抑制(NMS) 2.2AutoShape 2.3 Detections 2.4 Classify 三、实验 …...
qemu的snapshot快照功能的详细使用介绍
快照功能还是蛮有趣的,就是资料比较少,这边万能菜道人特意整理了一下。参考内容:QEMU checkpoint(snapshot) 使用-pudn.comKVM&QEMU学习笔记(二)-蒲公英云 (dandelioncloud.cn)在线迁移存储 - 爱码网 (likecs.com)…...
谷歌关键词优化多少钱【2023年调研】
本文主要分享Google关键词排名优化的一些成本调研,方便大家参考。 本文由光算创作,有可能会被剽窃和修改,我们佛系对待这种行为吧。 今年2023年了,谷歌关键词优化到底要多少钱? 答案是:价格在2w~25w左右…...
凸包及其算法
概念 凸包:一个能够将所有给定点围住的最小周长封闭图形。 稳定凸包:在当前组成凸包的点集 V0V_0V0 中新增一个不在凸包上的点,形成新点集 V1V_1V1,若可以使 V1V_1V1 中所有点都在 V1V_1V1 的点的凸包上,则这…...
计算机网络学习笔记(二)物理层
物理层(传输比特0/1)基本概念 物理层下的传输媒体 1. 导引型 同轴电缆,双绞线(绞合可抵御干扰),光纤,电力线 2. 非导引型(调制振幅 频率 相位) 无线电波,微…...
为什么职称要提前准备?
职称反映专业技术人员的学术和技术水平、工作能力的工作成就,具有学衔、岗位两种性质。目前中国现状下,职称主要代表社会地位,就业经验,职称等级越高,越容易得到更高的社会经济和福利待遇。 职称通过申报、评审的形式…...
MyBatis详解1——相关配置
一、什么是MyBatis 1.定义:是一个优秀的持久层框架(ORM框架),它支持自定义 SQL、存储过程以及高级映射。MyBatis是一个用来更加简单的操作和读取数据库的工具。 2.支持的操作方式:xml或者注解实现操作(xm…...
字节青训营——秒杀系统设计学习笔记(三)
限流算法 限流顾名思义,就是对请求或并发数进行限制;通过对一个时间窗口内的请求量进行限制来保障系统的正常运行。如果我们的服务资源有限、处理能力有限,就需要对调用我们服务的上游请求进行限制,以防止自身服务由于资源耗尽而…...
每天一道大厂SQL题【Day10】电商分组TopK实战
每天一道大厂SQL题【Day10】电商分组TopK实战 大家好,我是Maynor。相信大家和我一样,都有一个大厂梦,作为一名资深大数据选手,深知SQL重要性,接下来我准备用100天时间,基于大数据岗面试中的经典SQL题&…...
最全的免费录屏工具,这 19 款录屏软件绝对值得你收藏
屏幕录制软件可让您捕获屏幕以与他人共享,创建与产品相关的视频、教程、课程、演示、视频等。这些软件是您能够从网络摄像头和屏幕录制视频。以下是精选的顶级屏幕录像机列表。 适用于 PC 的19 款免费录屏屏幕录像机软件 1)奇客免费录屏 奇客免费录屏&am…...
vb.net计算之.net core基础(2)-发布应用
目录 发布程序测试运行运行方式发布程序 首先,将编译配置改为Release 然后,发布应用,在生成菜单下。 选择发布到文件夹 继续选择文件夹 接着,完成 关闭 点击发布标签栏的发布按钮...
微服务项目【商品秒杀接口压测及优化】
生成测试用户 将UserUtils工具类导入到zmall-user模块中,运行生成测试用户信息,可根据自身电脑情况来生成用户数量。 UserUtils: package com.xujie.zmall.utils;import com.alibaba.nacos.common.utils.MD5Utils; import com.fasterxml.j…...
1997. 访问完所有房间的第一天
题目 你需要访问 n 个房间,房间从 0 到 n - 1 编号。同时,每一天都有一个日期编号,从 0 开始,依天数递增。你每天都会访问一个房间。 最开始的第 0 天,你访问 0 号房间。给你一个长度为 n 且 下标从 0 开始 的数组 n…...
通达信交易接口以什么形式执行下单的?
通达信程交易接口 以API形式来执行下单接口,一般不再需要通过接口系统之间进行连接,通过直接调用通达信dll交易函数的方式直接进行交易,包括下单,撤单,查询资金股份、当日委托、当日成交等方面都能很快的执行出来。以a…...
视频网站切片怎么做/nba西部最新排名
原标题:这款加速器可以帮你免费解决LOL手游下载、账号注册、更新慢的一系列问题不少小伙伴们已经开玩英雄联盟手游了,由于国服目前还没有动静,现在能玩的都是海外服,如此一来就会产生一个问题,就是手游版LOL更新慢怎么…...
杭州建设网站/常州seo博客
概述 Unix 域套接字是一种客户端和服务器在单主机上的 IPC 方法。Unix 域套接字不执行协议处理,不需要添加或删除网络报头,无需验证和,不产生顺序号,无需发送确认报文,比因特网域套接字的效率更高。Unix 域套接字提供字…...
如何做独立手机网站/seo综合查询怎么用的
恭喜你! 你已经找到了大多数人都在使用的屏幕截图尺子的辅助工具.作为一个iOS开发者来说,我总觉得简单的应用程序来检查图片或截图中的对象/元素位置存在不足。现在通过本App很容易找到任意用户界面元素的位置和大小,特别是X/Y位置和宽度/高度/大小。这个应用程序是…...
java 框架用来做网站/最新军事头条
项目中原始数据都是DWG格式,里面只有两个层,一个0层,一个TX层,0层存储了图廓信息,所有其他要素信息全部存在TX层中,包括房屋,植被,道路,水系,独立地物等等。没…...
吴中公司网站建设找哪家/各大免费推广网站
3.9 闲聊数据类型 字符串: 单引号 双引号 三引号 数值: 整数 浮点 布尔 复数类型3.9.1 整型(整数) Python3的整型和长整型无缝结合 不再区分 长度取决于内存 优点-利于大数计算3.9.2 浮点型(小数) 科学记数法 E记法 也可以是e 源码…...
做电影网站技术/百度快速seo软件
第1关:使用K近邻算法进行分类 任务描述 本关任务:编写一个能使用K近邻算法进行简单的二分类的小程序。 相关知识 为了完成本关任务,你需要掌握: 什么是K近邻算法 在sklearn中如何使用K最近邻算法 什么是K最近邻算法 在许多机器学习相关的书籍当中,最开始被介绍的算法很…...