我们愿意与另一个 Java 团队开发的 C++ 库进行通信。
我们看到的最自然和最佳的方法是使用 JNI,但在开发期间为了简单起见使用 SWIG。
我们实际上已经开发了原型(prototype)并且运行良好。在使用 SWIG Director 进行第一次 Java->c++ 通信之后,还有一个 C++->Java 通信。
我们看到的主要问题是暴露于 C++ 库中可能存在的错误,例如内存损坏和内存泄漏。
似乎没有办法有效地防止这些错误。例如,在 C++ 中执行中止(模拟一些不正确的内存操作)将杀死 JVM
我们想到的解决方案是从将在 JBoss 中运行的父 JVM 启动几个 java 进程,这是我们愿意保护的。
启动 java 进程很困难,主要是因为需要先启动 JVM。
在这种情况下,我们想到的解决方案是使用多个 Nailgun 服务器。每个将加载 JVM 广告的人都将有权访问(在类路径中)我们要启动的程序。
每个 Nailgun 服务器中的每个 JVM(关系为 1-1)能够在同一 JVM 中同时运行我们程序的多个执行。如果发生某些错误,所有 此 Nailgun JVM 中的执行将崩溃(但 JBoss JVM 将存活)。出于这个原因,我们计划有几个执行次数有限的 Nailgun 服务器 并使用某种负载平衡将执行分派(dispatch)到任何服务器。此外,Nailgun 服务器将定期重启以防止 内存泄漏。
我们认为这是防止 C++ 崩溃的好方法。
但是我们想询问社区是否有更好的方法。
我忘了提到我们正在考虑的另一个解决方案是为了故障转移的原因在我们的 war 中使用集群 JBoss。然后根据 C++ 程序的可靠性可能合并或不合并 Nailgun 服务器。纯 JBoss 集群应用程序(没有 Nailgun 进程)的好处是我们不需要任何类型的进程间通信,整个操作将在具有线程的进程中执行。
最佳答案
有时,保护您的 Java 进程免受第三方 native 代码风险的最简单方法是在单独的进程中运行有风险的代码。
但是,这可能需要进程间通信,这会增加成本和复杂性。
关于Java -> 使用 SWIG over JNI 的 C++ 通信。防止 C++ 错误和内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15808597/