この記事の例では、Java を Windows サービス プログラムとして登録する方法と、簡単な Java スケジュールされたシャットダウン プログラム コードを説明し、参考として共有します。具体的な方法は以下の通りです。
1. 質問:
最近、コンピュータのシャットダウン時間を制御するソフトウェアを探していたのですが、インターネットでいくつか見つかりました。それらはすべて、特定のシャットダウン時間を設定できる視覚的なインターフェイスを備えたソフトウェアでした。私が書きたいシャットダウンプログラムは他人のマシン上で動作するため、そのマシンは夕方17時から23時25分までしかインターネットにアクセスできず、23時25分に自動的にシャットダウンすることができます。このソフトの「存在」を他人に感じさせないために(ユーザーが自分でスケジュールシャットダウンソフトを終了させないようにするため)、シャットダウンソフトをサービスとして登録し、バックグラウンドで実行したいと考えています。ここでは、javaService ソフトウェアを使用して Java プログラムを Windows サービスとして登録する方法を紹介します。
2.実施方法:
1. javaService を使用して Java プログラムを Windows サービスとして登録します
①javaServiceをダウンロードする
URL http://javaservice.objectweb.org/ にアクセスして、Windows バージョンの javaService ファイルをダウンロードします。最新バージョンは「2.0.10」です。
②javaServiceをインストールする
ダウンロードした javaServices をディレクトリ「D:/software/JavaService-2.0.10」に解凍します (任意のディレクトリに解凍できます。問題を避けるために、中国語のディレクトリに解凍しないことをお勧めします)。 )
③ スケジュールされたシャットダウンコードを書き込む
1) クラスの名前は次のとおりです。
com.test.timer.TimerShutDownWindows
2) 記述したJavaファイルをクラスとしてエクスポートし、エクスポートしたクラスをディレクトリ「D:/software/JavaService-2.0.10/classes/com/test/timer」に配置します。つまり、エクスポートした com パッケージを「D:/software/JavaService-2.0.10/classes」ディレクトリに置きます。
④ Java プログラムを Windows サービスとして登録するには、「D:/software/JavaService-2.0.10」ディレクトリに入り、次のコマンドを実行します。
次のようにコードをコピーします: JavaService.exe -install MyShutDownService "%JAVA_HOME%"/jre/bin/server/jvm.dll -Djava.class.path="%JAVA_HOME%"/lib/tools.jar;D:/software / JavaService-2.0.10/classes -start com.test.timer.TimerShutDownWindows
「-install」の後のパラメータはサービス名、「-start」の後のパラメータは起動するクラスの名前、「Djava.class.path」の後のパラメータは「D:/software/JavaService」です。 -2.0.10/classe" "このアドレスは、「TimerShutDownWindows」クラスが格納されているパスです。実際のアプリケーションでは、これを独自の classPath に変更するだけです。
ここで注意すべき点がいくつかあります。
1) "%JAVA_HOME%" jdk ディレクトリ。jdk ディレクトリが設定されていない場合は、jdk の実際の絶対アドレスに置き換えます。
2) -Djava.class.path が必要なのは、サービスの開始時にシステムの CLASSPATH 変数にアクセスできないためです。そのため、jar が多数ある場合は、ここで宣言する必要があります。長すぎるコマンドの作成を避けるために、「-Djava」を使用できます。 . ext.dirs=jar が配置されているディレクトリ」パラメータ。
3) サービスを追加した後、コマンド ラインに「services.msc」コマンドを入力してすべてのサービスを表示し、サービスの起動タイプ (自動起動または手動起動など) を変更できます。
⑤ テスト
1) サービスを開始する
サービスを登録した後、「net start MyShutDownService」コマンドを使用してサービスを開始できます。サービスが開始されると、my_shutdown.log ログ ファイルが D ドライブのルート ディレクトリに生成されます。
2) サービスを終了する
サービスをシャットダウンしたい場合は、「net stop MyShutDownService」コマンドでサービスをシャットダウンできます。
3) サービスの削除
サービスを削除したい場合は、「sc delete MyShutDownService」コマンドを使用してサービスを削除できます。
2. スケジュールされたシャットダウン コード
次のようにコードをコピーします。
java.io.ファイルをインポートします。
java.io.FileWriterをインポートします。
インポート java.io.IOException;
java.io.PrintWriterをインポートします。
インポート java.text.SimpleDateFormat;
java.util.Calendarをインポートします。
java.util.Dateをインポートします。
パブリック クラス TimerShutDownWindows {
/* シャットダウンが必要かどうかを検出する時間間隔*/
プライベート静的ロング m_nDetectInterval = 5000;
/* 最後の検出時刻をミリ秒単位で記録します */
プライベート静的ロング m_lLastMilliSeconds = 0;
/* コンピューターを使用できる最小時間 */
プライベート静的 int m_nUsePCMinHour = 17;
/* コンピューターを使用できる最大時間 */
プライベート静的 int m_nUseComputerMaxHour = 23;
/* この時間を分が超えた場合は、コンピューターをシャットダウンします */
プライベート静的 int m_nMinutes = 25;
/* ログファイルの保存場所 */
private static String m_sLogFile = "D:" + File.separator
+ "my_shutdown.log";
/* 現在のシステムが自動シャットダウン プログラムを開始したかどうかを記録します*/
プライベート静的ブール値 bHasShutDownPC = false;
/**
* @param 引数
*/
public static void main(String[] args) {
// 1. 検出するために別のスレッドを開始します
スレッド aThread = 新しいスレッド(new TimerDetector());
aThread.start();
}
/**
* 内部クラスを定義する
*
* @author 管理者
*
*/
静的クラス TimerDetector は Runnable {を実装します
/*
* (Javadoc 以外)
*
* @java.lang.Runnable#run() を参照
*/
public void run() {
// 1. ログファイルを取得する
PrintWriter 出力 = null;
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
試す {
out = new PrintWriter(new FileWriter(m_sLogFile, true), true);
} キャッチ (IOException e1) {
アウト = null;
e1.printStackTrace();
}
// 2. サービスの起動時間を記録する
appendLog(out, "サービスの起動時間:" + df.format(new Date()));
while (true) {
// 1. 現在のシステム時間が変更されているかどうかを確認します
ブール値 bShoudShutDownPC = validateShoudShutDownPC(out);
if (bShoudShutDownPC) {
// 検証失敗、強制シャットダウン
実行ShutDown(out);
} それ以外 {
bHasShutDownPC = false;
}
// 2. 現在のスレッドはスリープ状態になります
試す {
Thread.sleep(m_nDetectInterval);
} catch (InterruptedException e) {
appendLog(out, e.getMessage());
}
}
}
/**
* 現在時刻がシャットダウンする必要がある時刻であるかどうかを確認します
*
* @戻る
*/
private boolean validateShoudShutDownPC(PrintWriter _out) {
// 1. システム時間が変更されているかどうかを確認します
ブール値 bHasModifySystemTime = detectModifySytemTime(_out);
appendLog(_out, "bHasModifySystemTime:" + bHasModifySystemTime);
if (bHasModifySystemTime) {
bHasModifySystemTime を返します。
}
// 2. システム時間が変更されていない場合は、現在の時間が指定された時間を超えているかどうかを確認します。
ブール値 bShoudSleep = nowIsSleepTime();
appendLog(_out, "bShoudSleep:" + bShoudSleep);
if (bShoudSleep) {
bShoudSleep を返します。
}
false を返します。
}
/**
* 現在時刻が休憩時間であるかどうかを決定します
*
* @戻る
*/
プライベートブール値 nowIsSleepTime() {
// 1. 現在の時と分を取得します
カレンダー aCalendar = Calendar.getInstance();
int nHour = aCalendar.get(Calendar.HOUR_OF_DAY);
int nMinute = aCalendar.get(Calendar.MINUTE);
// 2. 現在の時間が PC の使用可能時間内であるかどうかを判断します。最大時間は 23 です。
if (nHour < m_nUsePCMinHour) {
true を返します。
}
// 23時は個別判断、23時半以降は休憩
if ((nHour >= m_nUseComputerMaxHour) && (nMinute >= m_nMinutes)) {
true を返します。
}
// 3. 非休憩時間
false を返します。
}
/**
* 誰かがシステム時刻を変更したかどうかを判断します。誰かがシステム時刻を変更した場合は、true を返します。<BR>
* それ以外の場合は false を返します
*
* @戻る
*/
private boolean detectModifySytemTime(PrintWriter _out) {
// 1. 初めてシステム時刻を検出します
if (m_lLastMilliSeconds == 0) {
m_lLastMilliSeconds = System.currentTimeMillis();
false を返します。
}
// 2. 2 つの時間の差を検出します
long lInteral = System.currentTimeMillis() - m_lLastMilliSeconds;
lInteral = Math.abs(lInteral);
// 3. 2 つの時間の間の時間間隔を決定します。2 つの結果は m_nDetectInterval と正確に等しくない場合があります。許容される誤差は 1 分です。
lMaxInterval = m_nDetectInterval + 60 * 1000;
appendLog(_out, "lInteral:::" + lInteral);
appendLog(_out, "lMaxInterval:::" + lMaxInterval);
if (lInteral > lMaxInterval) {
// 誰かがシステム時刻を変更し、強制的にシャットダウンしました
true を返します。
}
// 4. 最終検出時刻は、誰も時刻を変更しない場合にのみ記録されます。
m_lLastMilliSeconds = System.currentTimeMillis();
false を返します。
}
/**
* 指定されたストリームにログ情報を書き込みます
*
* @param _outWriter
* @param _sAppendContent
*/
private void appendLog(PrintWriter _outWriter, String _sAppendContent) {
if (_outWriter == null) {
戻る;
}
_outWriter.println(_sAppendContent);
}
/**
* シャットダウンコマンドを実行
*/
private voidexecuteShutDown(PrintWriter_out) {
if (bHasShutDownPC) {
SimpleDateFormat df = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
appendLog(_out, "システムがまもなくシャットダウンします。現在時刻: " + df.format(new Date()));
戻る;
}
appendLog(_out, "誰かがシステム時刻を変更したため、システムは強制的にシャットダウンされました!");
// シャットダウン
試す {
Runtime.getRuntime().exec(
"shutdown -s -t 120 -c /" とても遅い時間です。寝る時間です。2 分後にコンピューターをシャットダウンします。 /"");
} キャッチ (IOException e) {
appendLog(_out, e.getMessage());
}
bHasShutDownPC = true;
}
}
}
この記事が皆さんの Java プログラミングに役立つことを願っています。