项目背景
公司有一个项目,需要获取海康门禁等设备的出入记录,因为要实时获取海康设备的数据,所以后台通过定时任务的方式定时去轮询海康的restful接口服务,交互方式是走的海康提供的标准的sdk调用。但是因为业务方的设备在不同的园区,所以java后台要同时去轮询部署在不同服务器环境下的两个海康平台。
产生的问题
如1中所述,我们的java服务要同时去轮询部署在不同服务器环境下的两个海康平台,这两个平台下的设备,设备数据,请求的密钥以及ip等网络环境都是不一致的,这就是引发数据丢失问题的根源。请看下图:
调用海康平台a的代码封装:

调用海康平台b的代码封装:

通过上述代码,我们可以看出调用代码其实是一样的,只是封装的调用参数不一致。初始化定时任务时,后台代码会第一次去初始化接口请求参数。而关键在于,sdk是通过静态变量的方式去封装调用参数的,比如请求的接口ip是通过ArtemisConfig.host方式声明的:

通过这种静态变量的方式调用,如果超过调用一个以上的海康平台服务,就会产生问题。我们的后台逻辑是这样的,启动定时任务的时候回去初始化一遍调用参数,如果定时任务a的启动顺序在定时任务b之后,那么定时任务a的调用参数(静态)就是被定时任务b的参数覆盖掉,导致定时任务a用的是定时任务b的请求参数,这样定时任务a里面就是请求不到数据(因为任务a调用到海康平台b那边去了),从而产生数据丢失的问题,反之亦然。
排查的过程
排查调用日志-排查定时任务代码-查看海康平台调用记录-综合评估讨论-本地模拟测试-发现问题所在-得出结论
解决方案
摒弃sdk的调用方式,采用获取token的方式进行http服务调用。
如需要具体的调用方式请私信!!!