0

J2EE アプリケーションを Java アプリ サーバー (現在 weblogic を使用) で実行し、ネイティブ実行可能プロセスを開始して使用することは可能ですか?この Java アプリケーションのライフサイクルの一部として停止しましたか? (注: これはJNI ではなく、実際には別のネイティブ プロセスです。これは unix/linux ですが、Windows でも実行する必要があります。) この件に関するドキュメントは見つかりませんでした。おそらく正当な理由があります。

背景: ネイティブ プロセスは、実際にはハッキング不可能なモノリシックなサードパーティ ソフトウェア パッケージであり、stdin/stdout 以外の API はありません。Java アプリでは、特定のサービスを実行するためにネイティブ アプリが必要です。ProcessBuilder を介してネイティブ プロセスを簡単にラップし、(stdin/stdout を使用して) 開始/停止して通信することができます。テスト目的で、stdin/stdout 経由で通信し、「開始」、「シャットダウン」を受け取り、単純な「エコー」サービスを実行できる単純な exe (C++) があります。(「start」はノーオペレーションですが、ネイティブ プロセスが正常に開始された場合は単に「ok」を返します。)

したがって、理想的には、アプリ サーバーが起動/シャットダウンされたとき、および/またはデプロイされた Java アプリが起動/シャットダウンされたときに、関連付けられたネイティブ プロセスも起動/シャットダウンできます。そして理想的には、これはクリーンかつ確実に発生します (シャットダウン後にプロセスが長引くことはなく、すべての起動エラーがログに記録され、ライフサイクルのタイミングの問題が同期されます)。

これが実際に機能した場合、質問の「パート 2」は、これがクラスター/フェイルオーバー環境で実際に機能するかどうかです。ネイティブ プロセスは、プラットフォームおよびソフトウェア固有の監視および管理サービスに関連付けることができますが、可能であれば、Java アプリですべてをバンドルして管理したいと考えています。

Glassfish やその他の OSGi タイプの環境でこれがより簡単になる場合は、お気軽にお知らせください (オプションになる可能性があります... Glassfish の方が望ましいですが、WLS は包括的な義務です)。

私は概念実証をまとめようとしていますが、「はい、やった」または「いいえ、うまくいかない」という明確な答えは大歓迎です. doc リンクがある場合)。

編集:明確にするために(件名は誤解を招く可能性があります):かなりのJavaアプリケーションも実行されています(私が書いたもので、必要に応じて自由に変更できます)。サードパーティのネイティブ プロセスは、Java アプリケーションが必要とするサービスを実行するだけです。アプリ サーバーを介してネイティブ プロセスを管理しようとしているだけではありません。

4

1 に答える 1

1

パート 1 の答えは「はい」です。Java アプリケーション サーバーでネイティブ システム プロセスを管理することは絶対に可能です。ProcessBuilderを使用して外部プログラムを生成し、それと対話することを考えている場合は、これを自分でほとんど理解しているように思えます。それはほとんどそれを行う方法です。

私は過去にまさにそのようなセットアップを使用して、Java サーバー上にメディア トランスコーディング サービスを実装しました (Java サーバーは、ffmpeg プロセスを介してトランスコーディング ジョブを生成し、それらのステータスを監視し、成功/失敗をアプリケーションの残りの部分に報告しました)。 /等。)。どれだけきれいに実行できるかは、実装方法と外部アプリの動作 (つまり、シャットダウン要求に適切かつ迅速に応答することが保証されているか) によって異なりますが、(不可能ではないにしても) 非常に困難です。完全に完璧にします。少なくとも、誰かがkill -9Java サーバー プロセスで を実行した場合、少なくともサーバーが再起動され、ネイティブ プロセスが既に実行されていることを確認するまでは、ネイティブ プロセスを適切にシャットダウンする方法はありません。

2番目の部分は、「クラスター/フェイルオーバー環境で作業する」という意味に正確に依存します。ネイティブ プロセスの管理に関しては、Java で開始して操作できる場合は、Java でも管理できます。しかし、ネイティブ プロセスが存在するノードがダウンした場合に、新しいノードが以前とまったく同じ状態でプロセスを自動的に再開するような完全なフェイルオーバー動作が必要な場合、それは非常に困難であるか、不可能でさえある可能性があります。ただし、外部プロセスとの対話を抽象化して、Java コードが対話するサービスとして表示されるようにする場合 (たとえば、外部プロセスと対話して管理する方法を理解するファサード クラスにリクエストを送信するなど)かなり良い結果が得られるはずです。

私が実装したトランスコーディング サービスは (JBoss/Tomcat を使用して) クラスター化された環境で実行され、トランスコーディング ジョブが要求されるとメッセージがディスパッチされるという仕組みでした。このメッセージは、トランスコード要求のキューを管理する調整クラスによって受信され、ワー​​カー プロセスが使用可能になるとジョブが生成されます。キューの状態はクラスター全体に複製されたので、ffmpeg プロセスを実行しているノードがダウンした場合、現在スケジュールされているジョブが記憶され、適切なノードが再び利用可能になるとすぐに再開されます (トランスコーディング サービスは、ノードごとに有効化/無効化できます)。実際には、システムは非常に堅牢であることが証明されました。

于 2011-05-04T01:57:10.223 に答える