이 기사의 예제에서는 Java를 Windows 서비스 프로그램 및 간단한 Java 예약 종료 프로그램 코드로 등록하고 참조용으로 공유하는 방법을 설명합니다. 구체적인 방법은 다음과 같습니다.
1. 질문:
나는 최근에 컴퓨터의 종료 시간을 제어하는 소프트웨어를 찾고 싶었고 인터넷에서 몇 가지를 발견했습니다. 그것들은 모두 특정 종료 시간을 설정할 수 있는 시각적 인터페이스를 갖춘 소프트웨어였습니다. 내가 작성하고 싶은 종료 프로그램이 다른 사람의 컴퓨터에서 실행되기 때문에 그 컴퓨터는 저녁 17시부터 23시 25분까지만 인터넷에 접속할 수 있고, 23시 25분에는 자동으로 종료될 수 있다. 다른 사람이 이 소프트웨어의 "존재"를 느끼지 못하도록(사용자가 예약된 종료 소프트웨어를 스스로 닫는 것을 방지하기 위해) 종료 소프트웨어를 서비스로 등록하고 백그라운드에서 실행하고 싶습니다. 다음은 javaService 소프트웨어를 사용하여 Java 프로그램을 Windows 서비스로 등록하는 방법을 소개합니다.
2. 구현 방법:
1. javaService를 사용하여 Java 프로그램을 Windows 서비스로 등록합니다.
① javaService 다운로드
javaService 파일의 Windows 버전을 다운로드하려면 URL http://javaservice.objectweb.org/를 방문하세요. 최신 버전은 "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이 많은 경우 너무 긴 명령을 작성하지 않으려면 여기에서 선언해야 합니다. .ext.dirs=jar가 위치한 디렉토리" 매개변수.
3) 서비스가 추가된 후 명령줄에 "services.msc" 명령을 입력하여 모든 서비스를 확인하고 서비스의 시작 유형(자동 시작 또는 수동 시작 등)을 수정할 수 있습니다.
⑤ 테스트
1) 서비스 시작
서비스를 등록한 후 "net start MyShutDownService" 명령을 통해 서비스를 시작할 수 있습니다. 서비스가 시작되면 D 드라이브의 루트 디렉터리에 my_shutdown.log 로그 파일이 생성됩니다.
2) 서비스 종료
서비스를 종료하려면 "net stop MyShutDownService" 명령을 사용하여 서비스를 종료할 수 있습니다.
3) 서비스 삭제
서비스를 삭제하려면 "sc delete MyShutDownService" 명령을 사용하여 서비스를 삭제할 수 있습니다.
2. 예정된 종료 코드
다음과 같이 코드를 복사합니다. package com.test.timer;
java.io.파일 가져오기;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import 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;
/* 로그 파일의 저장 위치 */
개인 정적 문자열 m_sLogFile = "D:" + File.separator
+ "my_shutdown.log";
/* 현재 시스템이 자동 종료 프로그램을 시작했는지 기록*/
개인 정적 부울 bHasShutDownPC = false;
/**
* @param 인수
*/
공개 정적 무효 메인(String[] args) {
// 1. 감지하기 위해 별도의 스레드를 시작합니다.
스레드 aThread = new Thread(new TimerDetector());
aThread.start();
}
/**
* 내부 클래스 정의
*
* @author 관리자
*
*/
정적 클래스 TimerDetector는 Runnable을 구현합니다.
/*
* (Javadoc이 아닌)
*
* @java.lang.Runnable#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) {
아웃 = 널;
e1.printStackTrace();
}
// 2. 서비스 시작 시간 기록
appendLog(out, "서비스 시작 시간:" + df.format(new Date()));
동안 (참) {
// 1. 현재 시스템 시간이 수정되었는지 확인
부울 bShoudShutDownPC = 유효성 검사ShoudShutDownPC(out);
if (bShudShutDownPC) {
// 확인 실패, 강제 종료
excuteShutDown(out);
} 또 다른 {
bHasShutDownPC = 거짓;
}
// 2. 현재 스레드는 휴면 상태입니다.
노력하다 {
Thread.sleep(m_nDetectInterval);
} 잡기(InterruptedException e) {
AppendLog(out, e.getMessage());
}
}
}
/**
* 현재 시간이 종료가 필요한 시간인지 확인
*
* @반품
*/
개인 부울 유효성 검사ShoudShutDownPC(PrintWriter _out) {
// 1. 시스템 시간이 수정되었는지 확인
부울 bHasModifySystemTime = detectorModifySytemTime(_out);
AppendLog(_out, "bHasModifySystemTime:" + bHasModifySystemTime);
if (bHasModifySystemTime) {
bHasModifySystemTime을 반환합니다.
}
// 2. 시스템 시간이 수정되지 않은 경우 현재 시간이 지정된 시간을 초과하는지 확인합니다.
부울 bShoudSleep = nowIsSleepTime();
AppendLog(_out, "bShoudSleep:" + bShoudSleep);
if (bShudSleep) {
bShudSleep을 반환합니다.
}
거짓을 반환;
}
/**
* 현재시간을 휴식시간으로 할지 판단
*
* @반품
*/
개인 부울 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) {
사실을 반환;
}
// 23시는 개별판정이 필요하며, 23시 30분 이후에는 휴식을 취하셔야 합니다.
if ((nHour >= m_nUseComputerMaxHour) && (nMinute >= m_nMinutes)) {
사실을 반환;
}
// 3. 비휴식시간
거짓을 반환;
}
/**
* 누군가 시스템 시간을 수정했는지 확인합니다. 누군가 시스템 시간을 수정한 경우 true를 반환합니다. <BR>
* 그렇지 않으면 false를 반환합니다.
*
* @반품
*/
개인 부울 detectorModifySytemTime(PrintWriter _out) {
// 1. 처음으로 시스템 시간을 감지합니다.
if (m_lLastMilliSeconds == 0) {
m_lLastMilliSeconds = System.currentTimeMillis();
거짓을 반환;
}
// 2. 두 시간의 차이를 감지합니다.
long lInteral = System.currentTimeMillis() - m_lLastMilliSeconds;
lInteral = Math.abs(lInteral);
// 3. 두 번 사이의 시간 간격을 결정합니다. 두 결과는 m_nDetectInterval과 정확히 동일하지 않을 수 있습니다. 허용되는 오류는 1분입니다.
긴 lMaxInterval = m_nDetectInterval + 60 * 1000;
AppendLog(_out, "lInteral:::" + lInteral);
AppendLog(_out, "lMaxInterval:::" + lMaxInterval);
if (lInteral > lMaxInterval) {
// 누군가 시스템 시간을 수정하여 강제 종료했습니다.
사실을 반환;
}
// 4. 마지막 감지 시간은 아무도 시간을 수정하지 않는 경우에만 기록됩니다.
m_lLastMilliSeconds = System.currentTimeMillis();
거짓을 반환;
}
/**
* 지정된 스트림에 로그 정보 쓰기
*
* @param _outWriter
* @param _sAppendContent
*/
개인 무효 추가 Log(PrintWriter _outWriter, String _sAppendContent) {
if (_outWriter == null) {
반품;
}
_outWriter.println(_sAppendContent);
}
/**
* 종료 명령 실행
*/
개인 무효 실행ShutDown(PrintWriter _out) {
if (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 e) {
AppendLog(_out, e.getMessage());
}
bHasShutDownPC = 참;
}
}
}
이 글이 모든 사람의 Java 프로그래밍에 도움이 되기를 바랍니다.