アプリケーションを起動するときにリッスンするポートを開くという提案が最善のアイデアだと思います。
実行は非常に簡単で、アプリケーションを閉じるときにクリーンアップすることを心配する必要はありません。たとえば、ファイルに書き込んだ後、誰かがタスクマネージャを使用してプロセスを強制終了した場合、ファイルは削除されません。
また、私が正しく覚えていれば、JVM内からJavaプロセスのPIDを取得する簡単な方法はないので、PIDを使用してソリューションを作成しようとしないでください。
このような何かがトリックを行う必要があります:
private static final int PORT = 9999;
private static ServerSocket socket;
private static void checkIfRunning() {
try {
//Bind to localhost adapter with a zero connection queue
socket = new ServerSocket(PORT,0,InetAddress.getByAddress(new byte[] {127,0,0,1}));
}
catch (BindException e) {
System.err.println("Already running.");
System.exit(1);
}
catch (IOException e) {
System.err.println("Unexpected error.");
e.printStackTrace();
System.exit(2);
}
}
このサンプルコードは明示的にバインドされ127.0.0.1
、ファイアウォールの警告を回避する必要があります。このアドレスのトラフィックはローカルシステムからのものである必要があるためです。
ポートを選択するときは、既知のポートのリストに記載されているポートを避けるようにしてください。理想的には、競合が発生した場合に、使用するポートをファイル内またはコマンドラインスイッチを介して構成可能にする必要があります。