做系统集成,有时可能会遇到各种需求和问题。跨语言之间如何通信集成更是平常的工作。最近遇到的问题就时,有一个系统服务是c++编写的,其中需要接收外部的消息然后存储到hbase集群中。
服务基本完成后,测试写入速度性能,居然每秒最多才500条,每掉数据也不是很大8k左右。因为hbase对java意外的支持是通过thrift2中间件实现的,与java的API机制不同,看了下所有gen cpp的代码,发现没有相关类似java高性能写入的方法。而java的高性能写入,同样的数据大小可以达到每秒3000个。
于是解决有2个方案:1.存储写入单独使用java程序实现;2.c++调用java代码实现。对于方案一的缺点就是增加了系统应用部署和维护的繁杂度。虽然方案二在整个应用集成后的稳定性上有风险,但相信可以克服。
整体的代码就不粘贴了,仅对主要的点进行记录。
主要处理流程:调起jvm-》方法查询-》方法调用。
调起jvm是需要对jvm进行参数设置,主要是"-Djava.class.path"的配置。对于目标集成的java代码如果是按package存储的文件目录,直接设置"-Djava.class.path=顶层包所在目录",比如要在当前目录下查找com.test.MyTest这个类,直接设置"-Djava.class.path=."即可。
如果要调用的java是较复杂的程序,且是通过jar包发布的,就需要配置为"-Djava.class.path=.:jar文件路径名称",比如要在当前目录下的mytest.jar中查找调用类,则配置为"-Djava.class.path=.:mytest.jar"即可。
注意:发布的jar应用存在依赖,那么发布时需要将这些依赖unpack,即应用中依赖的jar包都需要解压成包目录。
c++和java之间的调用,注意参数的类型的转换即可。