我们愿意与另一个 Java 团队开发的 C++ 库进行交流。
我们见过的最自然和最优化的方法是使用 JNI,但在开发期间为了简单起见使用 SWIG。
我们实际上已经开发了原型并且运行良好。在使用 SWIG Director 进行第一次 Java->c++ 通信之后,还有一个 C++->Java 通信。
我们看到的主要问题是暴露于 C++ 库中可能出现的错误,例如内存损坏和内存泄漏。
似乎没有办法有效地防止这些错误。例如,在 C++ 中执行中止(模拟一些不正确的内存操作)将杀死 JVM
我们想到的解决方案是从父 JVM 中启动几个 Java 进程,这些进程将在 JBoss 中运行,这也是我们愿意保护的。
启动java进程很难,主要是因为需要先启动JVM。
在这种情况下,我们想到的解决方案是使用多个 Nailgun 服务器。每个都将加载一个 JVM 广告,将有权访问(在类路径中)我们要启动的程序。
每个 Nailgun 服务器中的每个 JVM(关系为 1-1)都能够在同一个 JVM 中同时运行我们的程序的多个执行。如果发生错误,此 Nailgun JVM 中的所有执行都将崩溃(但 JBoss JVM 将处于活动状态)。出于这个原因,我们安排了几个执行次数有限的 Nailgun 服务器,并使用某种负载平衡将执行分派到任何服务器。此外,Nailgun 服务器将定期重新启动以防止内存泄漏。
我们认为这是防止 C++ 崩溃的好方法。
但是,我们想询问社区是否有更好的方法。
我忘了提到我们正在考虑的另一个解决方案是让集群 JBoss 与我们的战争出于故障转移原因。然后可能会合并 Nailgun 服务器,这取决于 C++ 程序的可靠性。纯 JBoss 集群应用程序(没有 Nailgun 进程)的好处是我们不需要任何类型的进程间通信,整个操作将在具有线程的进程中执行。