天天看點

【任務筆記】建立windows作業系統下的服務程序,并随作業系統啟動自動開始執行

這個任務名稱寫的有點兒長,簡單來說就是類似于linux系統下的守護程序。在windows系統中,被稱為服務程序,可以在服務清單中檢視、開啟、關閉。

JAVA中其實程序的概念并不強烈,更多的接觸到的是線程。而實作這個守護程序,其實用到的也是線程。還有一個工具JavaService。

步驟如下:

1、建立兩個類:一個負責控制線程的啟停,一個就是運作的線程(代碼簡單,直接用txt寫,javac一下就行)

import java.util.*;

public class MyService 
{

	private static Thread thread = null;
	private static Service service = null;

	/**
	 * 退出服務方法(該方法必須有參數 String [] args)
	 * 
	 * @param args
	 */
	public static void stopService(String[] args) 
	{
		System.out.println("停止服務");
		service.setRunFlag(false);
	}

	/**
	 * 啟動服務方法(該方法必須有參數 String [] args)
	 * 
	 * @param args
	 */
	public static void startService(String[] args) 
	{
		System.out.println("啟動服務");
		// 産生服務線程
		service = new Service();
		thread = new Thread();
		try 
		{
			// 将服務線程設定為使用者線程,以避免StartService方法結束後線程退出
			thread.setDaemon(false);
			if (thread.isDaemon()) 
			{
				System.out.println("成功設定線程為使用者線程!");
			}
			thread.start();
			service.run();//這句一定要有啊。我查資料的時候就因為沒這句,怎麼都不能執行o(╯□╰)o是以要避免“盲目崇拜”
		} 
		catch (Exception e) 
		{
			System.out.println("設定失敗!");
		}
	}

}

class Service implements Runnable 
{

	private boolean runFlag = true;

	/**
	 * 設定服務線程運作标志值
	 */
	public synchronized void setRunFlag(boolean runFlag) 
	{
		this.runFlag = runFlag;
	}

	/**
	 * 取得服務線程運作标志值
	 */
	private synchronized boolean getRunFlag() 
	{
		return runFlag;
	}

	@Override
	public void run() 
	{
		System.out.println("服務線程開始運作。。。");
		while (getRunFlag()) 
		{
			/*
			 * 擷取系統時間
			 */
			Calendar cal = Calendar.getInstance();
			long mis = cal.getTimeInMillis();
			System.out.println("目前時間:" + mis);
			try 
			{
				Thread.sleep(1000*300);
			}
			catch (InterruptedException e) 
			{
				e.printStackTrace();
			}
		}
		System.out.println("服務線程結束運作。。。");
	}
}
           

2、把JavaService的解壓路徑加入到path

這步也可以直接把JavaService複制到MyService.class那個目錄裡

【任務筆記】建立windows作業系統下的服務程式,并随作業系統啟動自動開始執行

3、然後就打開cmd指令,跳轉至目前目錄,執行如下語句

JavaService.exe -install TJS "%JAVA_HOME%/jre/bin/server/jvm.dll" -Xmx128m -Djava.class.path=%CLASSPATH%;D:\javaTest -start MyService -method startService -stop MyService -method stopService -out "%CD%/out.log" -err "%CD%/err.log" -current "%CD%"

标紅那裡相當重要!因為必須在-Djava.class.path後加上你的類所在目錄才行。不然就會在啟動時出現啟動失敗,找不到類這樣的錯誤。網上有資料說在最後加個-auto,我是執行失敗,而且沒有auto也能開機自啟。求解釋~

TJS是TestJavaService,也就是這個服務程序顯示的程序名稱

現在建立好了,啟動方式有兩種:

a、在指令行輸入net start TJS

b、重新開機電腦(建議試試,這樣可以比較直覺的看到确實是開機自動運作的)

然後在out.log裡就可以看到輸出的結果了

【任務筆記】建立windows作業系統下的服務程式,并随作業系統啟動自動開始執行

在服務清單中也可以看到

【任務筆記】建立windows作業系統下的服務程式,并随作業系統啟動自動開始執行

不想要了也可以銷毀:JavaService -uninstall TJS

是以要保證你的程序名稱是唯一滴

關于每個指令的詳細含義,運作機制神馬的我就不過多的贅述了,網上都有。

筆記還是要有個筆記的樣子才好

【任務筆記】建立windows作業系統下的服務程式,并随作業系統啟動自動開始執行