如果你玩windows系统,你对服务这个东西并不会陌生,服务可以帮我们做很多事情,在不影响用户正常工作的情况下,可以完成很多我们需要的需求。
众所周知,微软的visio studio内置的Service类可以编写windows服务,对于一个Java开发人员来说,想要编写一个windows服务部署到服务器里面,
还要在自己的开发环境装一个visio studio,那太麻烦了。
那么问题来了,我想用java编写一个windows服务,这个想法可行吗?答案是肯定的,可行!
开源的JavaService帮我们解决了这一个问题,使用java也可以编写一个windows服务部署到windows里面。
闲话不多说,来看看如何利用JavaService实现Java编写部署windows服务。
首先需要用到的一些开发工具:
JDK
Eclipse
JavaService
这里我安装的JDK是1.6版本的,
Eclipse用于编写一个JAVA工程,
JavaService可在官网下载,下载地址:http://javaservice.objectweb.org,下载之前官方需要确认你的一些个人信息,提交后可以进入资源下载页面,我这里下载的是2.0.10版本。解压后有很多文件,我们只需要用到其中的JavaService.exe。
做饭炒一个菜,我们需要准备一些菜品原料,以上我们的菜都买好了,接下来看看主要准备工作和主要步骤。
首先安装JDK,默认安装到C盘就可以了。
然后配置java环境变量,这里就不细说了,上一个链接给予大家参考,环境变量要配置正确,这个很重要。
接着编写一个Java工程
这里我贴出我的代码示例出来,是工作的一个需求,大致看一些主要代码即可,我下面会提到的。
这里是工程结构:
代码:
package com.ecservice;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ECService {
private static Thread thread = null;
private static Service service = null;
/**
* 退出服务方法(该方法必须有参数 String [] args)
*
* @param args
*/
public static void StopService(String[] args) {
System.out.println(service.getLocalTime()+"停止服务");
service.setRunFlag(false);
}
/**
* 启动服务方法(该方法必须有参数 String [] args)
*
* @param args
*/
public static void StartService(String[] args) {
// 产生服务线程
service = new Service();
thread = new Thread(service);
System.out.println("\r\n"+service.getLocalTime()+"-----------启动服务-----------");
try {
// 将服务线程设定为用户线程,以避免StartService方法结束后线程退出
thread.setDaemon(false);
if (!thread.isDaemon()) {
System.out.println(service.getLocalTime()+"成功设定线程为用户线程!");
}
// 启动服务线程
thread.start();
} catch (SecurityException se) {
System.out.println(service.getLocalTime()+"线程类型设定失败!");
}
}
public static void main(String[] args) {
new Service().run();
// ECService.StartService(null);
}
}
class Service implements Runnable {
private boolean runFlag = true;
/**
* 设定服务线程运行标志值
*
* @param runFlag
*/
public synchronized void setRunFlag(boolean runFlag) {
this.runFlag = runFlag;
}
/**
* 取得服务线程运行标志值
*
* @param void
*/
@SuppressWarnings("unused")
private synchronized boolean getRunFlag() {