Contoh dalam artikel ini menjelaskan cara mendaftarkan Java sebagai program layanan Windows dan kode program shutdown terjadwal Java yang sederhana, dan membagikannya kepada Anda untuk referensi Anda. Metode spesifiknya adalah sebagai berikut:
1. Pertanyaan:
Baru-baru ini saya ingin mencari perangkat lunak untuk mengontrol waktu mati komputer, dan saya menemukan beberapa di Internet. Semuanya adalah perangkat lunak dengan antarmuka visual yang dapat mengatur waktu mati tertentu. Karena program shutdown yang ingin saya tulis berjalan di mesin orang lain, mesin tersebut hanya dapat mengakses Internet dari pukul 17:00 hingga 23:25 malam, dan dapat mati secara otomatis pada pukul 23:25. Untuk mencegah orang lain merasakan "keberadaan" perangkat lunak ini (untuk mencegah pengguna menutup sendiri perangkat lunak pematian terjadwal), saya ingin mendaftarkan perangkat lunak pematian sebagai layanan dan menjalankannya di latar belakang. Berikut ini pengenalan cara menggunakan software javaService untuk mendaftarkan program java sebagai layanan windows.
2. Metode pelaksanaan:
1. Gunakan javaService untuk mendaftarkan program java sebagai layanan windows
① Unduh javaService
Kunjungi URL http://javaservice.objectweb.org/ untuk mengunduh file javaService versi windows. Saya mengunduh JavaService-2.0.10.rar.
② Instal javaService
Buka zip Layanan java yang kami unduh ke direktori. Saya membuka ritsletingnya ke direktori "D:/software/JavaService-2.0.10" (Anda dapat mengekstraknya ke direktori mana pun. Sebaiknya jangan mengekstraknya ke direktori berbahasa Mandarin untuk menghindari masalah )
③ Tulis kode penutupan terjadwal
1) Nama kelasnya adalah:
com.test.timer.TimerShutDownWindows
2) Ekspor file java tertulis sebagai kelas, dan letakkan kelas yang diekspor di direktori "D:/software/JavaService-2.0.10/classes/com/test/timer". Artinya, letakkan paket com yang diekspor di direktori "D:/software/JavaService-2.0.10/classes".
④ Untuk mendaftarkan program java sebagai layanan windows, masuk ke direktori "D:/software/JavaService-2.0.10" dan jalankan perintah berikut:
Salin kode sebagai berikut: 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 -mulai com.test.timer.TimerShutDownWindows
Parameter setelah "-install" adalah nama layanan, parameter setelah "-start" adalah nama kelas yang akan dimulai, dan parameter setelah "Djava.class.path" adalah "D:/software/JavaService -2.0.10/classe" "Alamat adalah jalur tempat kelas "TimerShutDownWindows" saya disimpan. Dalam aplikasi sebenarnya, ubah saja ke classPath Anda sendiri.
Ada beberapa hal yang perlu diperhatikan di sini:
1) Direktori jdk "%JAVA_HOME%", jika direktori jdk tidak dikonfigurasi, ganti dengan alamat absolut jdk yang sebenarnya.
2) -Djava.class.path diperlukan karena variabel CLASSPATH sistem tidak dapat diakses saat layanan dimulai, sehingga harus dideklarasikan di sini; jika toplesnya banyak, untuk menghindari penulisan perintah yang terlalu panjang, kita dapat menggunakan "-Djava .ext.dirs=direktori tempat toples berada".
3) Setelah layanan ditambahkan, Anda dapat mengetikkan perintah "services.msc" pada baris perintah untuk melihat semua layanan, dan mengubah jenis startup layanan (startup otomatis atau startup manual, dll.).
⑤ Tes
1) Mulai layanan
Setelah kita mendaftarkan layanan, kita dapat memulai layanan melalui perintah "net start MyShutDownService". Setelah layanan dimulai, file log my_shutdown.log akan dibuat di direktori root drive D.
2) Tutup layanan
Jika kita ingin mematikan layanan, kita dapat mematikan layanan dengan perintah "net stop MyShutDownService".
3) Hapus layanan
Ketika kita ingin menghapus layanan, kita dapat menggunakan perintah "sc delete MyShutDownService" untuk menghapus layanan tersebut.
2. Kode penutupan terjadwal
Salin kode sebagai berikut: package com.test.timer;
impor java.io.File;
impor java.io.FileWriter;
impor java.io.IOException;
impor java.io.PrintWriter;
impor java.teks.SimpleDateFormat;
import java.util.Kalender;
import java.util.Date;
TimerShutDownWindows kelas publik {
/* Interval waktu untuk mendeteksi apakah shutdown diperlukan*/
pribadi statis panjang m_nDetectInterval = 5000;
/* Catat waktu deteksi terakhir, dalam milidetik */
pribadi statis panjang m_lLastMilliSeconds = 0;
/* Jam minimum komputer dapat digunakan */
pribadi statis int m_nUsePCMinHour = 17;
/* Jumlah jam maksimum komputer dapat digunakan */
private static int m_nUseComputerMaxHour = 23;
/* Jika menit melebihi waktu tersebut, matikan komputer */
pribadi statis int m_nMinutes = 25;
/* Lokasi penyimpanan file log */
String statis pribadi m_sLogFile = "D:" + File.separator
+ "my_shutdown.log";
/* Catat apakah sistem saat ini telah memulai program pematian otomatis*/
boolean statis pribadi bHasShutDownPC = false;
/**
* @param argumen
*/
public static void main(String[] args) {
// 1. Mulai thread terpisah untuk dideteksi
Thread aThread = Thread baru(TimerDetector baru());
aThread.mulai();
}
/**
* Tentukan kelas dalam
*
* @penulis Administrator
*
*/
kelas statis TimerDetector mengimplementasikan Runnable {
/*
* (non-Javadoc)
*
* @lihat java.lang.Runnable#run()
*/
menjalankan kekosongan publik() {
// 1. Dapatkan file log
Penulis Cetak keluar = null;
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
mencoba {
keluar = PrintWriter baru(FileWriter baru(m_sLogFile, benar), benar);
} tangkapan (IOException e1) {
keluar = batal;
e1.printStackTrace();
}
// 2. Catat waktu startup layanan
appendLog(keluar, "Waktu mulai layanan:" + df.format(Tanggal baru()));
sementara (benar) {
// 1. Tentukan apakah waktu sistem saat ini telah diubah
boolean bShoudShutDownPC = validasiShoudShutDownPC(keluar);
jika (bShoudShutDownPC) {
// Verifikasi gagal, pematian paksa
mengeksekusiShutDown(keluar);
} kalau tidak {
bHasShutDownPC = salah;
}
// 2. Thread saat ini tertidur
mencoba {
Thread.sleep(m_nDetectInterval);
} tangkapan (InterruptedException e) {
appendLog(keluar, e.getMessage());
}
}
}
/**
* Verifikasi apakah waktu saat ini adalah waktu yang perlu dimatikan
*
* @kembali
*/
validasi boolean pribadiShoudShutDownPC(PrintWriter _out) {
// 1. Tentukan apakah waktu sistem telah diubah
boolean bHasModifySystemTime = deteksiModifySytemTime(_out);
appendLog(_out, "bHasModifySystemTime:" + bHasModifySystemTime);
jika (bHasModifySystemTime) {
kembalikan bHasModifySystemTime;
}
// 2. Jika waktu sistem belum diubah, tentukan apakah waktu saat ini melebihi waktu yang ditentukan.
boolean bShoudSleep = sekarangIsSleepTime();
appendLog(_out, "bShoudSleep:" + bShoudSleep);
jika (bHarusTidur) {
kembali bShudSleep;
}
kembali salah;
}
/**
* Tentukan apakah waktu saat ini harus menjadi waktu istirahat
*
* @kembali
*/
boolean pribadi nowIsSleepTime() {
// 1. Dapatkan jam dan menit saat ini
Kalender aCalendar = Kalender.getInstance();
int nJam = aCalendar.get(Kalender.HOUR_OF_DAY);
int nMinute = aCalendar.get(Calendar.MINUTE);
// 2. Tentukan apakah jam saat ini berada dalam waktu PC dapat digunakan, jam maksimalnya adalah 23
jika (nJam < m_nGunakanPCMinJam) {
kembali benar;
}
// Jam 23 perlu dinilai secara individual, dan Anda harus istirahat setelah jam 23:30
if ((nJam >= m_nUseComputerMaxHour) && (nMinute >= m_nMinutes)) {
kembali benar;
}
// 3. Waktu non-istirahat
kembali salah;
}
/**
* Tentukan apakah seseorang telah mengubah waktu sistem. Jika seseorang telah mengubah waktu sistem, kembalikan nilai true, <BR>
* Jika tidak, kembalikan salah
*
* @kembali
*/
boolean pribadi detectorModifySytemTime(PrintWriter _out) {
// 1. Mendeteksi waktu sistem untuk pertama kalinya
jika (m_lLastMilliSeconds == 0) {
m_lLastMilliSeconds = Sistem.currentTimeMillis();
kembali salah;
}
// 2. Deteksi perbedaan antara dua waktu
panjang lInteral = Sistem.currentTimeMillis() - m_lLastMilliSeconds;
lInteral = Matematika.abs(lInteral);
// 3. Tentukan interval waktu antara dua waktu. Kedua hasil mungkin tidak sama persis dengan m_nDetectInterval.
panjang lMaxInterval = m_nDetectInterval + 60 * 1000;
appendLog(_out, "lInteral:::" + lInteral);
appendLog(_out, "lMaxInterval:::" + lMaxInterval);
if (lInteral > lMaxInterval) {
// Seseorang mengubah waktu sistem dan mematikan secara paksa
kembali benar;
}
// 4. Waktu deteksi terakhir dicatat hanya jika tidak ada yang mengubah waktunya.
m_lLastMilliSeconds = Sistem.currentTimeMillis();
kembali salah;
}
/**
* Tulis informasi log di aliran yang ditentukan
*
* @param _outWriter
* @param _sAppendContent
*/
private void appendLog(PrintWriter _outWriter, String _sAppendContent) {
jika (_outWriter == null) {
kembali;
}
_outWriter.println(_sAppendContent);
}
/**
* Jalankan perintah mematikan
*/
kekosongan pribadi mengeksekusiShutDown(PrintWriter _out) {
jika (bHasShutDownPC) {
SimpleDateFormat df = SimpleDateFormat baru(
"yyyy-MM-dd HH:mm:ss");
appendLog(_out, "Sistem akan dimatikan, waktu saat ini: " + df.format(Tanggal baru()));
kembali;
}
appendLog(_out, "Seseorang mengubah waktu sistem dan sistem terpaksa dimatikan!");
// Matikan
mencoba {
Waktu proses.getRuntime().exec(
"shutdown -s -t 120 -c /" Sudah larut, waktunya tidur, matikan komputer setelah 2 menit. /"");
} tangkapan (IOException e) {
appendLog(_out, e.getMessage());
}
bHasShutDownPC = benar;
}
}
}
Saya harap artikel ini bermanfaat untuk pemrograman Java semua orang.