توضح الأمثلة الواردة في هذه المقالة كيفية تسجيل Java كبرنامج خدمة Windows وكود برنامج Java المجدول لإيقاف التشغيل البسيط، ومشاركته معك كمرجع لك. الطريقة المحددة هي كما يلي:
1. السؤال:
لقد أردت مؤخرًا العثور على برنامج للتحكم في وقت إيقاف تشغيل الكمبيوتر، ووجدت عددًا قليلًا منه على الإنترنت، وكانت جميعها برامج ذات واجهات مرئية يمكنها تحديد أوقات إيقاف تشغيل محددة. نظرًا لأن برنامج إيقاف التشغيل الذي أريد كتابته يعمل على جهاز شخص آخر، فلا يمكن للجهاز الوصول إلى الإنترنت إلا من الساعة 17:00 إلى الساعة 23:25 مساءً، ويمكن إيقاف تشغيله تلقائيًا عند الساعة 23:25. من أجل منع الآخرين من الشعور "بوجود" هذا البرنامج (لمنع المستخدمين من إغلاق برنامج إيقاف التشغيل المجدول بأنفسهم)، أريد تسجيل برنامج إيقاف التشغيل كخدمة وتشغيله في الخلفية. فيما يلي مقدمة لكيفية استخدام برنامج javaService لتسجيل برنامج جافا كخدمة Windows.
2. طريقة التنفيذ:
1. استخدم javaService لتسجيل برنامج Java كخدمة Windows
① تنزيل javaService
قم بزيارة عنوان URL http://javaservice.objectweb.org/ لتنزيل إصدار Windows من ملف javaService. لقد قمت بتنزيل JavaService-2.0.10.rar.
② قم بتثبيت javaService
قم بفك ضغط javaServices الذي قمنا بتنزيله إلى الدليل. لقد قمت بفك ضغطه إلى الدليل "D:/software/JavaService-2.0.10" (يمكنك فك ضغطه إلى أي دليل. ومن الأفضل عدم فك ضغطه إلى دليل صيني لتجنب المشاكل )
③ اكتب رمز إيقاف التشغيل المجدول
1) اسم الفصل هو :
com.test.timer.TimerShutDownWindows
2) قم بتصدير ملف جافا المكتوب كفئة، ووضع الفئة المصدرة في الدليل "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 -بدء 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 للنظام عند بدء الخدمة، لذلك يجب الإعلان عنه هنا؛ إذا كان هناك العديد من الجرار، لتجنب كتابة أوامر طويلة جدًا، يمكننا استخدام "-Djava ext.dirs=الدليل الذي توجد به الجرار" المعلمة.
3) بعد إضافة الخدمة، يمكنك كتابة الأمر "services.msc" في سطر الأوامر لعرض كافة الخدمات، وتعديل نوع بدء تشغيل الخدمة (بدء التشغيل التلقائي أو بدء التشغيل اليدوي، وما إلى ذلك).
⑤ الاختبار
1) ابدأ الخدمة
بعد أن نقوم بتسجيل الخدمة، يمكننا بدء الخدمة من خلال الأمر "net start MyShutDownService". بعد بدء الخدمة، سيتم إنشاء ملف السجل my_shutdown.log في الدليل الجذر لمحرك الأقراص D.
2) إغلاق الخدمة
إذا أردنا إيقاف الخدمة، فيمكننا إيقاف الخدمة عن طريق الأمر "net stop MyShutDownService".
3) حذف الخدمة
عندما نريد حذف الخدمة، يمكننا استخدام الأمر "scحذف MyShutDownService" لحذف الخدمة.
2. رمز الاغلاق المقرر
انسخ الكود كما يلي: package com.test.timer;
استيراد java.io.File؛
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
استيراد java.util.Calendar؛
import java.util.Date;
الطبقة العامة TimerShutDownWindows {
/* الفاصل الزمني لاكتشاف ما إذا كان إيقاف التشغيل مطلوبًا*/
خاص ثابت طويل m_nDetectInterval = 5000؛
/* سجل وقت آخر اكتشاف بالمللي ثانية */
خاص ثابت طويل m_lLastMilliSeconds = 0؛
/* الحد الأدنى لساعات استخدام الكمبيوتر */
عدد صحيح ثابت خاص m_nUsePCMinHour = 17؛
/* الحد الأقصى لعدد الساعات التي يمكن استخدام الكمبيوتر فيها */
int الخاص الثابت m_nUseComputerMaxHour = 23؛
/* إذا تجاوزت الدقائق هذا الوقت، قم بإيقاف تشغيل الكمبيوتر */
عدد صحيح ثابت خاص m_nMinutes = 25؛
/* موقع تخزين ملف السجل */
سلسلة ثابتة خاصة m_sLogFile = "D:" + File.separator
+ "my_shutdown.log";
/* سجل ما إذا كان النظام الحالي قد بدأ تشغيل برنامج إيقاف التشغيل التلقائي*/
منطقية خاصة ثابتة bHasShutDownPC = false؛
/**
* @param args
*/
public static void main(String[] args) {
// 1. ابدأ موضوعًا منفصلاً للكشف عنه
Thread aThread = new Thread(new TimerDetector());
aThread.start();
}
/**
* تعريف الطبقة الداخلية
*
* @ المؤلف المسؤول
*
*/
فئة ثابتة TimerDetector تنفذ Runnable {
/*
* (غير جافادوك)
*
* @ راجع java.lang.Runnable#run()
*/
تشغيل الفراغ العام () {
// 1. احصل على ملف السجل
PrintWriter out = null;
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
يحاول {
out = new PrintWriter(new FileWriter(m_sLogFile, true), true);
} قبض (IOException e1) {
خارج = فارغ؛
e1.printStackTrace();
}
// 2. سجل وقت بدء تشغيل الخدمة
appendLog(out, "وقت بدء الخدمة:" + df.format(new Date()));
بينما (صحيح) {
// 1. تحديد ما إذا كان قد تم تعديل وقت النظام الحالي
boolean bShoudShutDownPC = validateShoudShutDownPC(out);
إذا (bShoudShutDownPC) {
// فشل التحقق، تم إيقاف التشغيل القسري
ExecuteShutDown(out);
} آخر {
bHasShutDownPC = false;
}
// 2. ينام الخيط الحالي
يحاول {
Thread.sleep(m_nDetectInterval);
} قبض على (InterruptedException e) {
appendLog(out, e.getMessage());
}
}
}
/**
* التحقق مما إذا كان الوقت الحالي هو الوقت الذي يجب إيقاف تشغيله
*
* @يعود
*/
التحقق المنطقي الخاص من صحةShoudShutDownPC(PrintWriter _out) {
// 1. تحديد ما إذا كان قد تم تعديل وقت النظام
boolean bHasModifySystemTime = DetectModifySytemTime(_out);
appendLog(_out, "bHasModifySystemTime:" + bHasModifySystemTime);
إذا (bHasModifySystemTime) {
إرجاع bHasModifySystemTime؛
}
// 2. إذا لم يتم تعديل وقت النظام، فحدد ما إذا كان الوقت الحالي يتجاوز الوقت المحدد.
boolean bShoudSleep = nowIsSleepTime();
appendLog(_out, "bShoudSleep:" + bShoudSleep);
إذا (بShoudSleep) {
عودة bShoudSleep؛
}
عودة كاذبة.
}
/**
* تحديد ما إذا كان الوقت الحالي يجب أن يكون وقت راحة
*
* @يعود
*/
منطقية خاصة nowIsSleepTime() {
// 1. احصل على الساعة والدقيقة الحالية
التقويم aCalendar = Calendar.getInstance();
int nHour = aCalendar.get(Calendar.HOUR_OF_DAY);
int nMinute = aCalendar.get(Calendar.MINUTE);
// 2. تحديد ما إذا كانت الساعة الحالية ضمن الوقت الذي يمكن فيه استخدام الكمبيوتر، والحد الأقصى للساعة هو 23
إذا (نساعة < m_nUsePCMinHour) {
عودة صحيحة؛
}
// يجب الحكم على الساعة 23 بشكل فردي، ويجب أن تأخذ قسطًا من الراحة بعد الساعة 23:30
إذا ((nHour >= m_nUseComputerMaxHour) && (nMinute >= m_nMinutes)) {
عودة صحيحة؛
}
// 3. وقت عدم الراحة
عودة كاذبة.
}
/**
* تحديد ما إذا كان شخص ما قد قام بتعديل وقت النظام إذا قام شخص ما بتعديل وقت النظام، قم بإرجاع صحيح، <BR>
* وإلا العودة كاذبة
*
* @يعود
*/
كشف منطقي خاص ModifySytemTime(PrintWriter _out) {
// 1. اكتشف وقت النظام لأول مرة
إذا (m_lLastMilliSeconds == 0) {
m_lLastMilliSeconds = System.currentTimeMillis();
عودة كاذبة.
}
// 2. اكتشف الفرق بين الوقتين
long lInteral = System.currentTimeMillis() - m_lLastMilliSeconds;
lInteral = Math.abs(lInteral);
// 3. تحديد الفاصل الزمني بين مرتين قد لا تكون النتيجتان متساويتين تمامًا مع m_nDetectInterval. الخطأ المسموح به هو دقيقة واحدة.
long lMaxInterval = m_nDetectInterval + 60 * 1000;
appendLog(_out, "lInteral:::" + lInteral);
appendLog(_out, "lMaxInterval:::" + lMaxInterval);
إذا (lInteral > lMaxInterval) {
// قام شخص ما بتعديل وقت النظام وأجبر على إيقاف التشغيل
عودة صحيحة؛
}
// 4. يتم تسجيل آخر وقت للكشف فقط إذا لم يقم أحد بتعديل الوقت.
m_lLastMilliSeconds = System.currentTimeMillis();
عودة كاذبة.
}
/**
* كتابة معلومات السجل في الدفق المحدد
*
* @param _outWriter
* @param _sAppendContent
*/
خاص باطل appendLog(PrintWriter _outWriter, String _sAppendContent) {
إذا (_outWriter == فارغة) {
يعود؛
}
_outWriter.println(_sAppendContent);
}
/**
* تنفيذ أمر إيقاف التشغيل
*/
باطل خاص ExecuteShutDown(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 /" لقد فات الوقت، حان وقت النوم، وأغلق الكمبيوتر بعد دقيقتين. /"");
} قبض (IOException ه) {
appendLog(_out, e.getMessage());
}
bHasShutDownPC = true;
}
}
}
آمل أن تكون هذه المقالة مفيدة لبرمجة جافا للجميع.