ตัวอย่างในบทความนี้อธิบายวิธีการลงทะเบียน Java เป็นเซอร์วิสโปรแกรม Windows และโค้ดโปรแกรมปิดระบบตามกำหนดเวลา Java แบบธรรมดา และแบ่งปันกับคุณเพื่อเป็นข้อมูลอ้างอิง วิธีการเฉพาะมีดังนี้:
1. คำถาม:
เมื่อเร็วๆ นี้ฉันต้องการค้นหาซอฟต์แวร์เพื่อควบคุมเวลาปิดเครื่องคอมพิวเตอร์ และพบซอฟต์แวร์บางตัวบนอินเทอร์เน็ต เนื่องจากโปรแกรมปิดเครื่องที่ฉันต้องการเขียนทำงานบนเครื่องของคนอื่น เครื่องจึงสามารถเข้าถึงอินเทอร์เน็ตได้เฉพาะเวลา 17.00 น. ถึง 23.25 น. ในตอนเย็นเท่านั้น และจะปิดเครื่องโดยอัตโนมัติในเวลา 23.25 น. เพื่อป้องกันไม่ให้ผู้อื่นรู้สึกถึง "การมีอยู่" ของซอฟต์แวร์นี้ (เพื่อป้องกันไม่ให้ผู้ใช้ปิดซอฟต์แวร์การปิดระบบตามกำหนดเวลาด้วยตนเอง) ฉันต้องการลงทะเบียนซอฟต์แวร์การปิดระบบเป็นบริการและเรียกใช้ในเบื้องหลัง ต่อไปนี้เป็นคำแนะนำเกี่ยวกับวิธีใช้ซอฟต์แวร์ javaService เพื่อลงทะเบียนโปรแกรม Java เป็นบริการ Windows
2. วิธีการนำไปปฏิบัติ:
1. ใช้ javaService เพื่อลงทะเบียนโปรแกรม java เป็นบริการ windows
① ดาวน์โหลด javaService
ไปที่ URL http://javaservice.objectweb.org/ เพื่อดาวน์โหลดไฟล์ javaService เวอร์ชัน windows ฉันดาวน์โหลด JavaService-2.0.10.rar เวอร์ชันล่าสุดคือ "2.0.10"
② ติดตั้ง javaService
แตกไฟล์ javaServices ที่เราดาวน์โหลดไปยังไดเร็กทอรี ฉันแตกไฟล์มันไปที่ไดเร็กทอรี "D:/software/JavaService-2.0.10" (คุณสามารถแตกไฟล์ไปยังไดเร็กทอรีใดก็ได้ วิธีที่ดีที่สุดคืออย่าแตกไฟล์ลงในไดเร็กทอรีภาษาจีนเพื่อหลีกเลี่ยงปัญหา) )
3. เขียนโค้ดการปิดระบบตามกำหนดเวลา
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 - ติดตั้ง MyShutDownService "%JAVA_HOME%"/jre/bin/server/jvm.dll -Djava.class.path="%JAVA_HOME%"/lib/tools.jar;D:/software / JavaService-2.0.10/classes - เริ่มต้น com.test.timer.TimerShutDownWindows
พารามิเตอร์หลัง "-install" คือชื่อของบริการ พารามิเตอร์หลัง "-start" คือชื่อของคลาสที่จะเริ่มต้น และพารามิเตอร์หลัง "Djava.class.path" คือ "D:/software/JavaService -2.0.10/classe" "ที่อยู่คือเส้นทางที่เก็บคลาส "TimerShutDownWindows" ของฉัน ในแอปพลิเคชันจริง เพียงเปลี่ยนเป็น classPath ของคุณเอง
มีประเด็นที่ควรทราบที่นี่:
1) ไดเรกทอรี jdk "%JAVA_HOME%" หากไม่ได้กำหนดค่าไดเรกทอรี jdk ให้แทนที่ด้วยที่อยู่จริงของ jdk
2) -Djava.class.path จำเป็นเนื่องจากไม่สามารถเข้าถึงตัวแปร CLASSPATH ของระบบได้เมื่อเริ่มบริการ ดังนั้นจึงต้องประกาศไว้ที่นี่ ถ้ามี jar จำนวนมาก เพื่อหลีกเลี่ยงการเขียนคำสั่งที่ยาวเกินไป เราสามารถใช้ "-Djava.path" . ext.dirs=ไดเร็กทอรีที่มี jars ตั้งอยู่"
3) หลังจากเพิ่มบริการแล้ว คุณสามารถพิมพ์คำสั่ง "services.msc" บนบรรทัดคำสั่งเพื่อดูบริการทั้งหมด และแก้ไขประเภทการเริ่มต้นของบริการ (การเริ่มต้นอัตโนมัติหรือการเริ่มต้นด้วยตนเอง ฯลฯ)
⑤ ทดสอบ
1) เริ่มบริการ
หลังจากที่เราลงทะเบียนบริการแล้ว เราสามารถเริ่มบริการผ่านคำสั่ง "net start MyShutDownService" หลังจากเริ่มบริการแล้ว ไฟล์บันทึก my_shutdown.log จะถูกสร้างขึ้นในไดเร็กทอรีรากของไดรฟ์ D
2) ปิดบริการ
หากเราต้องการปิดบริการ เราสามารถปิดบริการได้โดยใช้คำสั่ง "net stop MyShutDownService"
3) ลบบริการ
เมื่อเราต้องการลบบริการ เราสามารถใช้คำสั่ง "sc ลบ MyShutDownService" เพื่อลบบริการได้
2. รหัสการปิดระบบตามกำหนดเวลา
คัดลอกรหัสดังต่อไปนี้: แพคเกจ com.test.timer;
นำเข้า java.io.File;
นำเข้า java.io.FileWriter;
นำเข้า java.io.IOException;
นำเข้า java.io.PrintWriter;
นำเข้า java.text.SimpleDateFormat;
นำเข้า java.util.Calendar;
นำเข้า java.util.Date;
TimerShutDownWindows คลาสสาธารณะ {
/* ช่วงเวลาในการตรวจสอบว่าจำเป็นต้องปิดระบบหรือไม่*/
ส่วนตัวคงยาว m_nDetectInterval = 5,000;
/* บันทึกเวลาการตรวจจับครั้งล่าสุด หน่วยเป็นมิลลิวินาที */
ส่วนตัวคงยาว m_lLastMilliSeconds = 0;
/* จำนวนชั่วโมงขั้นต่ำที่คอมพิวเตอร์สามารถใช้ได้ */
int คงที่ส่วนตัว m_nUsePCMinHour = 17;
/* จำนวนชั่วโมงสูงสุดที่คอมพิวเตอร์สามารถใช้ได้ */
int ส่วนตัวคงที่ m_nUseComputerMaxHour = 23;
/* หากเกินเวลานี้ ให้ปิดเครื่องคอมพิวเตอร์ */
int ส่วนตัวคงที่ m_nMinutes = 25;
/* ตำแหน่งการจัดเก็บไฟล์บันทึก */
สตริงคงที่ส่วนตัว m_sLogFile = "D:" + File.separator
+ "my_shutdown.log";
/* บันทึกว่าระบบปัจจุบันได้เริ่มโปรแกรมปิดเครื่องอัตโนมัติแล้วหรือยัง*/
บูลีนคงที่ส่วนตัว bHasShutDownPC = false;
-
* @param args
-
โมฆะคงที่สาธารณะ main (String [] args) {
// 1. เริ่มเธรดแยกต่างหากเพื่อตรวจจับ
เธรด aThread = เธรดใหม่ (ตัวจับเวลาใหม่ ());
aThread.start();
-
-
* กำหนดคลาสภายใน
-
* @ผู้เขียน ผู้ดูแลระบบ
-
-
TimerDetector คลาสคงที่ใช้ Runnable {
-
* (ไม่ใช่ Javadoc)
-
* @see java.lang.Runnable#run()
-
โมฆะสาธารณะวิ่ง () {
// 1. รับไฟล์บันทึก
PrintWriter ออก = null;
SimpleDateFormat df = SimpleDateFormat ใหม่ ("yyyy-MM-dd HH:mm:ss");
พยายาม {
ออก = new PrintWriter (FileWriter ใหม่ (m_sLogFile, true), true);
} จับ (IOException e1) {
ออก = โมฆะ;
e1.printStackTrace();
-
// 2. บันทึกเวลาเริ่มต้นบริการ
appendLog(ออก, "เวลาเริ่มต้นบริการ:" + df.format(วันที่ใหม่()));
ในขณะที่ (จริง) {
// 1. ตรวจสอบว่าเวลาของระบบปัจจุบันได้รับการแก้ไขหรือไม่
บูลีน bShoudShutDownPC = validateShoudShutDownPC (ออก);
ถ้า (bShoudShutDownPC) {
// การยืนยันล้มเหลว บังคับให้ปิดเครื่อง
ดำเนินการShutDown (ออก);
} อื่น {
bHasShutDownPC = เท็จ;
-
// 2. เธรดปัจจุบันอยู่ในโหมดสลีป
พยายาม {
Thread.sleep(m_nDetectInterval);
} จับ (InterruptedException e) {
ผนวกLog(ออก, e.getMessage());
-
-
-
-
* ตรวจสอบว่าเวลาปัจจุบันเป็นเวลาที่ต้องปิดเครื่องหรือไม่
-
* @กลับ
-
บูลีนส่วนตัว validateShoudShutDownPC (PrintWriter _out) {
// 1. ตรวจสอบว่าเวลาของระบบได้รับการแก้ไขหรือไม่
บูลีน bHasModifySystemTime = detectorModifySytemTime(_out);
ผนวกLog(_out, "bHasModifySystemTime:" + bHasModifySystemTime);
ถ้า (bHasModifySystemTime) {
กลับ bHasModifySystemTime;
-
// 2. หากเวลาของระบบไม่ได้รับการแก้ไข ให้พิจารณาว่าเวลาปัจจุบันเกินเวลาที่กำหนดหรือไม่
บูลีน bShoudSleep = ตอนนี้เป็น SleepTime ();
ผนวกLog(_out, "bShoudSleep:" + bShoudSleep);
ถ้า (bShoudSleep) {
กลับ bShoudSleep;
-
กลับเท็จ;
-
-
* พิจารณาว่าเวลาปัจจุบันควรเป็นเวลาพักหรือไม่
-
* @กลับ
-
บูลีนส่วนตัวตอนนี้คือ SleepTime () {
// 1. รับชั่วโมงและนาทีปัจจุบัน
ปฏิทิน aCalendar = Calendar.getInstance();
int nHour = aCalendar.get(ปฏิทิน.HOUR_OF_DAY);
int nMinute = aCalendar.get(ปฏิทิน.MINUTE);
// 2. กำหนดว่าชั่วโมงปัจจุบันอยู่ภายในเวลาที่พีซีสามารถใช้ได้หรือไม่ ชั่วโมงสูงสุดคือ 23
ถ้า (nHour < m_nUsePCMinHour) {
กลับเป็นจริง;
-
// 23 โมงต้องตัดสินเป็นรายบุคคลและควรพักหลัง 23.30 น.
ถ้า ((nHour >= m_nUseComputerMaxHour) && (nMinute >= m_nMinutes)) {
กลับเป็นจริง;
-
// 3. เวลาไม่พัก
กลับเท็จ;
-
-
* ตรวจสอบว่ามีคนแก้ไขเวลาของระบบหรือไม่ หากมีคนแก้ไขเวลาของระบบ ให้คืนค่าจริง <BR>
* มิฉะนั้นให้คืนค่าเท็จ
-
* @กลับ
-
บูลีนส่วนตัว detectorModifySytemTime (PrintWriter _out) {
// 1. ตรวจจับเวลาของระบบเป็นครั้งแรก
ถ้า (m_lLastMilliSeconds == 0) {
m_lLastMilliSeconds = System.currentTimeMillis();
กลับเท็จ;
-
// 2. ตรวจจับความแตกต่างระหว่างสองครั้ง
ยาว lInteral = System.currentTimeMillis() - m_lLastMilliSeconds;
lInteral = Math.abs(lInteral);
// 3. กำหนดช่วงเวลาระหว่างสองครั้ง ผลลัพธ์ทั้งสองอาจไม่เท่ากับ m_nDetectInterval อย่างแน่นอน ข้อผิดพลาดที่อนุญาตคือ 1 นาที
ยาว lMaxInterval = m_nDetectInterval + 60 * 1,000;
ผนวกLog(_out, "lInteral:::" + lInteral);
ผนวกLog(_out, "lMaxInterval:::" + lMaxInterval);
ถ้า (lInteral > lMaxInterval) {
// มีคนแก้ไขเวลาของระบบและบังคับให้ปิดระบบ
กลับเป็นจริง;
-
// 4. เวลาการตรวจจับครั้งล่าสุดจะถูกบันทึกเฉพาะในกรณีที่ไม่มีใครแก้ไขเวลา
m_lLastMilliSeconds = System.currentTimeMillis();
กลับเท็จ;
-
-
* เขียนข้อมูลบันทึกในสตรีมที่ระบุ
-
* @param _outWriter
* @param _sAppendContent
-
โมฆะส่วนตัว appendLog (PrintWriter _outWriter, สตริง _sAppendContent) {
ถ้า (_outWriter == null) {
กลับ;
-
_outWriter.println(_sAppendContent);
-
-
* ดำเนินการคำสั่งปิดเครื่อง
-
โมฆะส่วนตัวดำเนินการShutDown (PrintWriter _out) {
ถ้า (bHasShutDownPC) {
SimpleDateFormat df = 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 จ) {
ผนวกLog(_out, e.getMessage());
-
bHasShutDownPC = จริง;
-
-
-
ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับการเขียนโปรแกรม Java ของทุกคน