一、
利用javaService
注册java
程序为windows
服务
[1]
下载javaService
访问网址http://javaservice.objectweb.org/
下载windows
版本的javaService
文件,我下载的是JavaService-2.0.10.rar
,目前最新的版本就是“2.0.10
”。
[2]
安装javaService
解压我们下载下来的javaServices
到一个目录,我是解压到目录“D:/software/JavaService-2.0.10
”下(解压到任何目录都可以,最好别解压到中文目录,省的出现问题
)
[3]
编写定时关机代码,见第二章的定时关机代码
1)
具体代码参加第二章,类的名字为:
com.test.timer.TimerShutDownWindows
2)
把编写后的java
文件导出为class
的形式,把导出的类放到目录“D:/software/JavaService-2.0.10/classes/com/test/timer
”下。也就是把导出的com
包放到
“D:/software/JavaService-2.0.10/classes”
目录下。
[4]
注册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=jars
所在目录”参数。
3)
服务添加之后,可以在命令行中敲入“services.msc
”命令来查看所有服务,并可以对服务的启动类型(自动启动还是手动启动等)进行修改。
[5]
测试
1)
启动服务
当我们注册完服务后,我们可以通过命令“net start MyShutDownService
”来启动该服务,服务启动后会在D
盘根目录生成my_shutdown.log
日志文件。
2)
关闭服务
如果我们要关闭服务,可以通过命令“net stop MyShutDownService
”来关闭该服务。
3)
删除服务
当我们想删除该服务时,可以使用命令“sc delete MyShutDownService
”来删除该服务。
二、
定时关机代码
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class TimerShutDownWindows {
/* 检测是否需要关机的时间间隔 */
private static long m_nDetectInterval = 5000;
/* 记录上次检测的时间,以毫秒为单位 */
private static long m_lLastMilliSeconds = 0;
/* 可以使用电脑的最小小时 */
private static int m_nUsePCMinHour = 10;
/* 可以使用电脑的最大小时 */
private static int m_nUseComputerMaxHour = 12;
/* 如果分钟超过这个时间,则关机计算机 */
private static int m_nMinutes = 25;
/* 记录日志的文件的保存位置 */
private static String m_sLogFile = "D:" + File.separator
+ "my_shutdown.log";
/* 记录当前系统是否已经启动自动关闭程序 */
private static boolean bHasShutDownPC = false;
/**
* @param args
*/
public static void main(String[] args) {
// 1. 单独开启一个线程去检测
Thread aThread = new Thread(new TimerDetector());
aThread.start();
}
/**
* 定义内部类
*
* @author Administrator
*
*/
static class TimerDetector implements Runnable {
/*
*
* @see java.lang.Runnable#run()
*/
public void run() {
// 1. 获取日志文件
PrintWriter out = null;
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
out = new PrintWriter(new FileWriter(m_sLogFile, true), true);
} catch (IOException e1) {
out = null;
e1.printStackTrace();
}
// 2. 记录服务启动时间
appendLog(out, " 服务启动时间:" + df.format(new Date()));
while (true) {
// 1. 判断当前系统时间是否被修改过
boolean bShoudShutDownPC = validateShoudShutDownPC(out);
if (bShoudShutDownPC) {
// 验证没通过,强制关机
exectueShutDown(out);
} else {
bHasShutDownPC = false;
}
// 2. 当前线程休眠下
try {
Thread.sleep(m_nDetectInterval);
} catch (InterruptedException e) {
appendLog(out, e.getMessage());
}
}
}
/**
* 验证当前时间是否是需要关机的时间
*
* @return
*/
private boolean validateShoudShutDownPC(PrintWriter _out) {
// 1. 判断是否修改了系统时间
boolean bHasModifySystemTime = detectModifySytemTime(_out);
appendLog(_out, "bHasModifySystemTime :" + bHasModifySystemTime);
if (bHasModifySystemTime) {
return bHasModifySystemTime;
}
// 2. 没有修改系统时间,则判断当前时间是否超过了指定的时间
boolean bShoudSleep = nowIsSleepTime();
appendLog(_out, "bShoudSleep :" + bShoudSleep);
if (bShoudSleep) {
return bShoudSleep;
}
return false;
}
/**
* 判断当前时间是否应该休息的时间
*
* @return
*/
private boolean nowIsSleepTime() {
// 1. 获取当前小时和分钟
Calendar aCalendar = Calendar.getInstance();
int nHour = aCalendar.get(Calendar.HOUR_OF_DAY);
int nMinute = aCalendar.get(Calendar.MINUTE);
// 2. 判断当前小时是否在可以使用PC 的时间内, 最大小时为23
if (nHour < m_nUsePCMinHour) {
return true;
}
// 23 点需要单独判断,超过23 点30 就应该休息
if ((nHour >= m_nUseComputerMaxHour) && (nMinute >= m_nMinutes)) {
return true;
}
// 3. 非休息时间
return false;
}
/**
* 判断是否有人修改了系统时间,如果有人修改了系统时间返回true ,<BR>
* 否则返回false
* @return
*/
private boolean detectModifySytemTime(PrintWriter _out) {
// 1. 第一次检测系统时间
if (m_lLastMilliSeconds == 0) {
m_lLastMilliSeconds = System.currentTimeMillis();
return false;
}
// 2. 检测两次时间的差值
long lInteral = System.currentTimeMillis() - m_lLastMilliSeconds;
lInteral = Math.abs(lInteral);
// 3. 判断两次的时间间隔, 两次结果不一定完全等于 m_nDetectInterval ,允许误差为1 分钟
long lMaxInterval = m_nDetectInterval + 60 * 1000;
appendLog(_out, "lInteral :::" + lInteral);
appendLog(_out, "lMaxInterval :::" + lMaxInterval);
if (lInteral > lMaxInterval) {
// 有人修改了系统时间,强制关机
return true;
}
// 4. 只有没人修改时间才记录上次检测时间
m_lLastMilliSeconds = System.currentTimeMillis();
return false;
}
/**
* 在指定的流中写入日志信息
*
* @param _outWriter
* @param _sAppendContent
*/
private void appendLog(PrintWriter _outWriter, String _sAppendContent) {
if (_outWriter == null) {
return;
}
_outWriter.println(_sAppendContent);
}
/**
* 执行关机命令
*/
private void exectueShutDown(PrintWriter _out) {
if (bHasShutDownPC) {
SimpleDateFormat df = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
appendLog(_out, " 系统即将关闭, 当前时间:" + df.format(new Date()));
return;
}
appendLog(_out, " 有人修改了系统时间,系统强制关机!");
// 关机
try {
Runtime.getRuntime().exec(
"shutdown -s -t 120 -c \" 很晚了,该睡觉了,2 分钟后关闭计算机。\"");
} catch (IOException e) {
appendLog(_out, e.getMessage());
}
bHasShutDownPC = true;
}
}
}
any question to QQ :526151410
分享到:
相关推荐
在Java编程环境中,将Java程序注册为Windows服务是一项常见的任务,尤其当你的应用程序需要在系统启动时自动运行或后台持续运行时。这个过程涉及到Java的JNI(Java Native Interface)和Windows的服务管理API。以下...
在项目的开发中,有时候需要将Java应用程序打包成Windows服务,我们就直接可以通过windows的服务来启动和关闭java程序了。 本博文将通过有两种方法实现该功能,手动创建法和Maven自动打包法。
本文将深入讲解如何利用Java Agent技术来注册Java应用为Windows服务。 首先,我们需要理解Java Agent。Java Agent是一种可以在JVM启动时附加到Java应用程序的模块,它允许我们在类加载到内存之前或之后对字节码进行...
Java Service Wrapper是一个强大的工具,它允许开发者将Java应用程序轻松地包装为Windows系统服务,以便在操作系统启动时自动启动Java程序,并能实现与系统服务相同的管理功能,如自动重启、日志记录等。这个工具...
总之,JavaService 是Java开发者在Windows平台上部署Java应用程序为服务的利器,它简化了服务的创建和管理流程,使得Java应用能够无缝融入Windows系统的服务管理体系中。通过合理配置和使用,JavaService可以帮助...
总之,要在Windows上实现Java服务的自动重启,我们可以利用Java Service Wrapper的内置功能,或者通过编写bat脚本结合Windows任务计划程序来达到目的。无论哪种方式,关键在于正确地监控服务状态并在需要时执行启动...
总结来说,利用JavaService将Java应用程序包装成Windows服务,可以提高程序的自动化和管理能力,尤其适用于需要长期后台运行的程序。同时,通过winsw和配置文件,我们可以灵活地控制服务的启动、停止、安装和卸载,...
总之,JavaService是一个强大的工具,使得Java开发者能够充分利用Windows服务功能,确保Java应用程序在Windows环境中高效、稳定地运行。通过提供的`hello2`示例,开发者可以快速理解并掌握如何将Java应用转化为...
3. 使用JavaService的命令行工具(如installUtil.exe)来安装服务,这会将配置好的Java应用注册为Windows服务。 4. 配置服务的启动参数,如JVM选项,可通过服务管理器或命令行工具进行设置。 5. 启动、停止或管理...
使用命令行执行Winsw,将你的Java程序注册为服务。例如: ``` myService.exe install ``` 如果需要设置服务为自动启动,可以加上`-start`参数: ``` myService.exe install -start ``` 5. **管理服务** ...
"利用Java创建Windows服务"的话题正好涵盖了这个需求。下面将详细介绍如何通过Java来实现这一功能。 首先,我们需要了解Java中的`java.util.Service`接口,它并不是用来直接创建Windows服务的,而是用于Java的SPI...
本文将详细介绍如何利用Java Service Wrapper工具将Java程序转换为Windows服务运行的过程。 #### Java Service Wrapper简介 Java Service Wrapper是一款开源工具,用于将任何Java应用程序封装成一个Windows服务...
3. 包装应用:使用JavaService.exe将Java应用程序包装为服务。 4. 安装服务:运行JavaService.exe并指定安装命令,将服务注册到系统服务管理器。 5. 管理服务:通过`net start`和`net stop`命令,或者使用Java...
在Java开发中,将应用程序发布为Windows服务是常见的需求,特别是在需要后台长期运行且自动启动的应用场景下。本文将深入探讨如何使用Java实现这一功能。 首先,我们需要理解什么是Windows服务。Windows服务是一种...
它会利用Java的`java.util.ServiceLoader`接口或者Windows的服务管理API来完成注册过程。 “Tail4win.exe”可能是一个日志监控工具,尤其在Windows系统中用于查看和跟踪日志文件的变化,这对于调试和监控服务的运行...
本教程将深入讲解如何利用Java Service Wrapper将Java程序转化为系统服务。 首先,我们需要了解Java Service Wrapper的核心组件。`wrapper.conf`是Wrapper的配置文件,其中包含了运行Java应用的配置参数,如Java的...
JavaService.exe是由Java Service Wrapper (JSW) 提供的,这是一个开源工具,用于将Java应用程序转换为Windows服务。JSW提供了一种方便的方式来管理Java应用的启动、停止、重启和监控,同时还支持故障恢复和日志记录...
要将Java应用注册为Windows服务,我们可以利用Java的工具——`java-service-wrapper`。这是一个开源工具,允许我们将Java应用程序包装成Windows服务。它的工作原理是创建一个批处理脚本(通常在`scripts`目录下),...
首先,选择合适的工具或方法将Java应用封装为服务,例如使用Java Service Wrapper或编写自定义的启动脚本。接着,配置服务的启动参数,包括JVM参数、应用参数等,确保服务能够高效稳定运行。然后,设置服务的自动...