2

Java の別のチームによって開発された C++ ライブラリと通信したいと考えています。

これまで見てきた自然で最適なアプローチは JNI を使用することですが、開発中は簡単にするために SWIG を使用します。

私たちは実際にプロトタイプを開発し、うまく機能しています。SWIG Director を使用した最初の Java->c++ 通信の後に、C++->Java 通信もあります。

これまで見てきた主な問題は、メモリ破損やメモリ リークなど、C++ ライブラリで発生する可能性のあるエラーにさらされることです。

これらのエラーから効果的に保護する方法はないようです。たとえば、C++ で中止 (不正なメモリ操作をシミュレート) を実行すると、JVM が強制終了されます。

私たちが考えた解決策は、JBoss で実行される親 JVM からいくつかの Java プロセスを起動することであり、それを保護したいと考えています。

基本的に、最初にJVMを起動する必要があるため、Javaプロセスの起動は困難です。

この場合、私たちが考えた解決策は、複数の Nailgun サーバーを使用することです。それぞれがJVM広告をロードし、起動したいプログラムに(クラスパスで)アクセスできます。

各 Nailgun サーバー (関係は 1-1) の各 JVM は、同じ JVM でプログラムの複数の実行を同時に実行できます。エラーが発生すると、この Nailgun JVM でのすべての実行がクラッシュします (ただし、JBoss JVM は動作します)。このため、実行数を制限したいくつかの Nailgun サーバーを用意し、何らかの負荷分散を使用して実行を任意のサーバーにディスパッチするようにスケジュールしました。さらに、メモリ リークを防ぐために、Nailgun サーバーは定期的に再起動されます。

これは、C++ のクラッシュから保護するための優れたアプローチであると考えています。

ただし、より良いアプローチがあるかどうかコミュニティに尋ねたいと考えています。

私たちが検討しているもう 1 つの解決策は、フェールオーバーの理由から、war に JBoss をクラスター化することです。そして、C++ プログラムの信頼性に応じて、Nailgun サーバーを組み込むかどうかを決定します。純粋な JBoss クラスター化アプリケーション (Nailgun プロセスなし) の利点は、プロセス間通信が一切必要なく、操作全体がスレッドを使用するプロセスで実行されることです。

4

2 に答える 2

1

Java プロセスをサードパーティのネイティブ コードのリスクから保護する最も簡単な方法は、危険なコードを別のプロセスで実行することである場合があります。

ただし、これにはプロセス間通信が必要になる場合があり、コストと複雑さが増す可能性があります。

于 2013-04-04T13:46:43.120 に答える
0

私はクラスタ化されたアプローチが一番気に入っています。Java のクラッシュから保護され (JVM は純粋な Java でもクラッシュする可能性があります。また、無限ループや全メモリ イーターのミスによっても JVM が失速する可能性があります)、SWIG ソリューションを使用できるようになります。

一方、クラッシュを恐れている場合は、ビジネス データを変更するメモリの破損も恐れる必要があります。

于 2013-04-04T13:56:42.330 に答える