检测wlkx模型解析数据写入Berkerly DB数据库的稳定性
检测wlkx模型解析数据写入Berkerly DB数据库的稳定性
背景
对于wlkx模型解析,会生成package文件和db文件。上传操作会把package文件中包含所有的mdl文件信息,全部写入到同一个Berkerly DB数据库文件当中。之前对于wlkx模型解析,采用的是Java端通过JIN机制,调用DLL动态库与C++端进行交互。这样会引起的问题是:C++端动态库解析崩溃后,造成了Java端Tomcat服务器也崩溃。
设计方案:
为了解决上述问题,我们采用JAVA端直接调用C++应用程序EXE进行模型解析操作,即每个wlkx模型解析分别对应一个模型解析EXE程序。当有多个wlkx文件需要解析时候,就需要启动多个模型解析EXE程序分别对应解析。并把解析后的返回值信息,通过写入共享文件的方式,回传给JAVA端进行通知。
同时,为了测试Berkeley DB数据库稳定性,我们需要构建一套检测bdb稳定性实现方案。
需要使用的技术
数据库:Berkerly DB数据库
线程池 + 队列 任务管理器
双WaitForMultipleObjects机制
思路描述:
启动一个应用程序EXE,采用线程池 + 队列,构成任务管理器。检测包含多个wlkx文件的文件夹,获取wlkx文件全路径放在容器当中,刚开始先启动指定数量(10~20个左右,根据测试需要可以调)的wlkx文件进行解析,
启动一个应用程序EXE,采用异步的方式,通过检测包含多个wlkx的文件夹,获取指定数量的wlkx文件,来启动多个相对应的模型解析EXE程序,进行模型解析操作。若某些wlkx文件解析出问题,通过日志信息,可以拿出来单独跟进解析。
测试关于写入Berkeley DB数据库。
在解析bdb期间,把需要记录的相关信息写入到日志文件当中,以方便查找出问题的wlkx文件,以测试其稳定性。
##测试读取Berkeley DB数据库。
可以根据bdb API库接口,循环读取数据,测试是否是完整正常的bdb文件。
注意问题
1、进程管理,刚开始可以控制为10个左右,根据测试需要,增加进程数。
2、需要监听进程状态,进程运行结束后,启动新的进程。
3、关于日志记录格式(信息不够可扩展):
(1)模型解析开始:
#######begin########
进程的ID.
解析的wlkx名称
系统时间
(2)模型解析结束:
进程的ID.
系统时间
#######end########
需求设计
模型解析类型实现
Java端调用格式:
解析.exe “wlkx=模型路径” “db=bdb 文件路径” “guid=标识guid” “param=param”
例: 解析.exe “wlkx=c:\path.wlkx” “db=D:\analysisDlls\desc\File.db” “guid=37624c4c-0560-40d0-920e-14727a491248” “param=”
每一次有一个wlkx就启动一个进程传入db
解析程序(解析.exe)执行过程:
- 将wlkx解析为package 和db
- 从db中提取出mdl的名称
- 读取mdl,解析到bdb中去,并获取旧mdl名称和新mdl名称(现已经封装好接口)
- 通知java端解析状态、以及解析的mdl旧名称与新名称的映射(通过内存共享、文件共享、socket或者消息等均可)
- 通知格式: 状态(0,1)|返回值(错误码或者100)|old1.mdl,new1.mdl; old2.mdl,new2.mdl;
例如:37624c4c-0560-40d0-920e-14727a491248|1|100|old1.mdl,new1.mdl; old2.mdl,new2.mdl;
或:37624c4c-0560-40d0-920e-14727a491248|0|-26|
退出解析程序
- Java端接收通知,根据状态进行下一步处理:
- 如果失败,记录失败的错误代码
- 如果成功,则继续解析属性等信息
注意事项:
- Guid作为解析的唯一标识,任何一次传入标识均不相同,
- Java端每次收到一个wlkx后,即开始启动一个进程并传入参数,然后开始等待消息,同时收到多个wlkx,启动多个解析程序
- 解析时,解包过程是直接解析到wlkx所在文件夹里了,不删除db和package
- 无论成功或失败,必须要通知java端,禁止中途退出应用程序
- 暂时不再考虑中途控制解析进度的功能
- 最后一个param暂时无用,后续如果有需要时进行扩展
解析xml类型实现:
解析xml约定形式
D:\123.xml
解析bdb的mdl生成到xml接口:
Java端调用格式:解析.exe “action=GetXml” “db=bdb 文件路径” “mdl=mdl名称” “xml=xml保存文件路径” “guid=标识guid” “param=”
例: 解析.exe “action=GetXml” “db=D:\analysisDlls\desc\File.db” “mdl=801d4b740e05c60ddb867517e8584c20.mdl“ “xml=D:\PipeQH.xml” “guid=37624c4c-0560-40d0-920e-14727a491248” “param=”
解析完毕通知java端消息:
通知格式:GUID| 动作|状态(0,1)|返回值(错误码或者100)|XML路径
例如:37624c4c-0560-40d0-920e-14727a491248| GetXml |1|100|d:\vue\PipeQH.xml
或:37624c4c-0560-40d0-920e-14727a491248| GetXml |0|-26|
注意事项:
Guid作为解析的唯一标识,任何一次传入标识均不相同,作为java端动作的唯一标识
无论成功或失败,必须要通知java端,禁止中途不通知Java端直接退出应用程序
当action为空时,默认为模型解析;当参数不符合各自的动作参数要求时,提示一个错误码并返回失败
错误码保持原有错误码形式
param暂时无用