- PR -

アプリケーションの制御について

1
投稿者投稿内容
未記入
会議室デビュー日: 2005/05/31
投稿数: 6
投稿日時: 2005-05-31 18:29
はじめまして。

Java Web Startを利用したJavaアプリケーションの開発を行っています。
JNLPファイルより、Jarファイルをダウンロードしアプリケーションを起動していますが、
更に、そのアプリケーションの中から別のJNLPファイルにアクセスし、
別のアプリケーションを起動しています。

そこで、親のアプリケーションを終了した場合に、
子のアプリケーションも終了したいと思っています。

制御する方法をご存知の方は教えていただけないでしょうか?

ちなみにJNLPファイルをキックする方法は、
jnlp.jarのBasicServiceを使用しています。

【開発環境】
・OS Windows 2003 Server
・JDK 1.5.0_02

シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-06-02 17:15
いちばん簡単なのは、親アプリと子アプリを同一のJVM上で
起動してしまうことではないでしょうか。
親アプリから子アプリのブートストラップクラスのmain()を
呼ぶとか。
子アプリの停止方法を変更しないと、子を停止したときに
親も一緒に死んでしまうので注意が必要ですが。

独立したプロセスにしたい場合、
・RMIで停止命令を通知する。
・ファイルを共有メモリ代わりに使用する。
あたりなら、プラットフォームに依存せずに実装できそうです。
未記入
会議室デビュー日: 2005/05/31
投稿数: 6
投稿日時: 2005-06-03 10:46
しゅんさんへ

ご回答ありがとうございます。
独立したプロセスにしたいのですが…

・RMIで停止命令を通知する。
ということですが、通信方法がよくわかりません。
@ 親アプリの終了イベントが呼ばれる
A サーバーのリモートオブジェクトを呼ぶ
B ???
C 子アプリの終了イベントが呼ばれる
以上の手順になると考えられるのですが、
サーバーのオブジェクトから子アプリの終了イベントを呼ぶことは
可能なのでしょうか?

可能でなければ、サーバーのリモートオブジェクトに
子のインスタンスを渡し終了させることは可能なのでしょうか?

色々調べていましたが、解決できません。
ご存知でしたら教えていただけますか?
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-06-03 11:38
例えばこんな感じです。

1.子アプリにRMIサーバーオブジェクトを一個もたせておく。
2.親アプリには、子アプリRMIオブジェクトの登録受け付けを行うRMIサーバー
 オブジェクトを一個持たせておき、RMIレジストリにバインドしておく。
 (このとき、LocateRegistry#createRegistry()を使用すると、RMIレジストリ
 サーバーを親アプリケーションのJVM上で起動できるので便利ですよ)
3.子アプリは、起動処理中などのタイミングで、「子アプリのRMIサーバーオブジェクトへ
 の参照」を引数にして親アプリのRMIサーバーオブジェクトのメソッドをコールする。
4.親アプリは、3で子アプリから受け取った「子アプリのRMIサーバーオブジェクトへの参照」
 を保存しておく。
5.親アプリ終了時に、4で保存しておいた参照を経由して子アプリに終了通知を行う。
6.子アプリは、終了通知を受け取ったら終了する。

このとき、「子アプリのRMIサーバーオブジェクト」をレジストリに登録する必要
はありません。「子アプリのRMIサーバーオブジェクトへの参照」経由のアクセスを
行うことで、位置情報を解決することができます。

RMIを使うと、こんな感じで分散アプリケーションでObserverパターンを実装するの
も簡単ですよ。余り知られていないかもしれませんが。

[ メッセージ編集済み 編集者: シュン 編集日時 2005-06-03 11:47 ]
未記入
会議室デビュー日: 2005/05/31
投稿数: 6
投稿日時: 2005-06-03 12:23
ご回答ありがとうございます。

RMI(Java初心者)を使用したことがないので、
初歩的な質問で申し訳ありません。

簡単なRMIのプログラムを作成して、
コンパイルを行おうと思ったのですが、
下記のようなコンパイルエラーが発生してしまいます。

なぜこのようなエラーが発生するのでしょうか?


---エラー内容----------------------------------------
C:\RMI_TEST\Server>rmic helloObj
Exception in thread "main" java.lang.InternalError: Unexpected exception while d
efining class helloObj
<<No stacktrace available>>
Caused by: java.lang.ClassNotFoundException: java.rmi.server.UnicastRemoteObject
-----------------------------------------------------
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-06-06 13:27
すみません、そういう状態(rmicがコンパイルできない状態)に
なったことがないので、分かりません。

RMICの実行時に、当然見つかるはずのコアAPIのライブラリ(java.rmi.server.UnicastRemoteObject)が見つからなかった
ということのようですので、環境を再確認してみてください、
という程度のことしかいえませんが…

ちなみに、問題のクラスを含むコアAPIライブラリ(Classファイル)
は、(JREインストールディレクトリ)/lib/rt.jarです。
1

スキルアップ/キャリアアップ(JOB@IT)