基于Fast-DDS实现远程通信
1.C++ 部分时间DDS的注册监听功能,通过JNI将指令通知到Java层
2.通信数据接口参考网络请求数据结构,使用Gson对数据类做转换,通过DDS通信时转为json字符串,server和client在收到后对数据进行转换
3.DDS的build指令被放到了项目的cmakefile中,直接运行即可
4.项目必须设置NDK路径,否则会因为app的版本过低报权限问题
注意
1.通过DDS进行通信时需要密切注意UI操作和线程切换,这些操作会一些不可预测的异常错误,通常表现为server端任务还为处理完返回,client端就已经开始报result数据异常
2.后期最好在c++中try/cache异常进行打印,否则运行时会比较难以排查问题
3....
TODO
1.需要对server端进入业务模块分发处进行优化,理应先进行一次gid解析,分析出action需要分配到哪个模块,在通过map取出模块的listener进行回调,再将执行结果返回到client,这里应该不使用gson进行解析即可完成
2.client端的请求可能不需要一直保留?理应每次请求完成后释放当前资源,否则容易内存泄露。但若所属模块请求频率较高,也应当适当保存部分参数提高请求效率
3.server端和client端应当在接收原始数据后首先进行一次结构解析,判断是否是合法数据,否则异常数据被用于json解析会导致程序崩溃
4.未进行压力测试,可能高并发环境会出现异常
5.需要做timeout检测,否则在未检测到server的情况下会block住业务
经过此案例,dds是可以进行阻塞式的接口定义并完成结果取回。 常规远程操作一般分为注册监听和发起请求, 此demo主要应用与发起请求 注册监听:
1.监听可以通过定义指定模块idl结构体,client直接对server端发布的指定的模块数据进行监听
2.java和c++提供一个manager,用来维护listener队列,提供对应的add和remove接口
3.client端监听到数据后通过manager将数据通知到已注册的模块即可