- PR -

JAVAの二重起動防止は可能?

投稿者投稿内容
sumin
ベテラン
会議室デビュー日: 2003/07/17
投稿数: 93
投稿日時: 2003-07-26 09:20
スミンです。

簡単にサンプルを作って試して見ましたが永続化はされないようです。多分、JDKの起動の際にSystemの属性を動的に取得しているのではと思われます。使えるかなと思いましたが。。JDK1.4以下ならこの方法で如何でしょうか?

package src;

import java.util.Enumeration;
import java.util.Properties;

public class SystemPropertiesChecker {

public static void main(String[] args) {
System.setProperty("aaaaaaaaaaaaaa", "bbbbbbbbbbbbbbbbb");// 属性を設定する事も可能である。この行を削除してもう一回実行して比較して見れば?
Properties prop = System.getProperties();
Enumeration enu = prop.keys();
while (enu.hasMoreElements()) {
String key = (String)enu.nextElement();
System.out.println(key + ": " + prop.getProperty(key));
}
}
}
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2003-07-26 21:45
引用:

JDK1.4以下ならこの方法で如何でしょうか?


既に、ToGoさんが言っているように、java.util.Propertiesでは解決
しません。これは JVMごとに独立したオブジェクトです。

私なら、ToGoさんの最初の提案にある ServerSocketが簡単で、確実でいい
と思います。
OSが余程ヘマしないかぎり、異常終了で資源を占有しつづけることは
ありませんし、同一ホストでの排他に使うだけなのでファイアーウオール
の影響もないのではないでしょうか。
sumin
ベテラン
会議室デビュー日: 2003/07/17
投稿数: 93
投稿日時: 2003-07-27 11:56
ご指摘の通りです。
一つのJVM上でと言う仮定で考えていました。
お騒がせしました。申し訳ございません。
yoshi
会議室デビュー日: 2003/08/29
投稿数: 5
投稿日時: 2003-08-29 11:12
初めて投稿します
yoshiです。

javaの1.4からfilechannelというクラスが追加されたようです。
それを使えばファイルをロックすることで2重起動の防止ができます。
ファイルをロックするだけなので、プログラムが不正に終了した場合でも大丈夫です。

public boolean isDoubleStart() throws FjupdException{
boolean isStart = true;

try {
//ファイルをオープンします
rm = new RandomAccessFile(new File(checkFileAddress),"rw");

fChannel = rm.getChannel();

//ファイルをロックしようとします
if(fChannel.tryLock() != null){
log.info("ファイルをロックします");
//ロックができたら、フラグを変更します
isStart = false;
}

} catch (Exception e) {

log.log(Level.WARNING,"2重起動ファイルチェックに失敗しました",e);
throw new FjupdException("2重起動ファイルチェックに失敗しました");
}

return isStart;
}

どうでしょうか?

_________________


[ メッセージ編集済み 編集者: yoshi 編集日時 2003-08-29 11:14 ]
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2003-08-30 10:28
java.nio.channels.FileChannelが使用する java.nio.channels.FileLockクラスについて、SDKドキュメントを調べてみると,
『プラットフォームの依存性』の項目に
「ロックされた領域のコンテンツにその他のプログラムからアクセスできなくなるかどうかは、システムによって決まるため未指定です。」
とあります。

多分、ファイルロックは多くのプラットフォームでうまく行くかもしれませんが、うまく行かない場合もあると思われます。
たまだ
会議室デビュー日: 2003/01/08
投稿数: 1
投稿日時: 2003-09-01 11:49
java.io.File#deleteOnExit を使えば JVM が正常に終了した時に削除されます.
異常終了もサポートしたいならば,java.lang.Runtime#addShutdownHook を
使えばよいと思います.
それでも心配なら,ロックファイルに起動時の時間を書き込んでおき,
その時間を見て,処理を行わずに終了するか,処理を行うかを決めるのは
どうでしょう.

こんな感じの処理は何回か書いたことがあります.


[ メッセージ編集済み 編集者: たまだ 編集日時 2003-09-01 11:49 ]
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2003-09-02 01:13
引用:

異常終了もサポートしたいならば,java.lang.Runtime#addShutdownHook を使えばよいと思います.


良くないと思います。
APIドキュメントには、次の様に明記されてます。
引用:

仮想マシンが異常終了するとシャットダウンフックの実行は保証できません。

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