摘要:可以實現把一個程序包裝成后臺服務的功能。另一種簡單方法是在程序啟動后監聽一個指定端口,需要停止程序時,通過協議向該端口發送關閉命令即可。
在操作系統中,有一些應用程序是以后臺服務形式運行的,如Mysql程序等,windows提供服務管理器,可以很方便地啟動和停止一個服務。JAVA程序也可以包裝成服務程序,像Tomcat那樣,通過腳本程序很容易啟動和停止tomcat服務。Apache Common Daemon可以實現把一個JAVA程序包裝成后臺服務的功能。停止一個在后臺運行的JAVA程序有很多方法,一種簡單的方法是找到該程序的PID,直接用kill命令把進程殺死。另一種簡單方法是在程序啟動后監聽一個指定端口,需要停止程序時,通過TCP協議向該端口發送關閉命令即可。示例如下:
服務端程序,模擬正在后臺運行的JAVA程序
/** - 本程序模擬一個不斷輪詢消息隊列,從消息隊列中取出消息,然后執行業務的程序, - 程序啟動后監聽8888端口,當收到“stop”命令時,退出程序 */ public class BackgroundApp { private static boolean forceExit = false; /** * 監聽8888端口,當收到“stop”命令時,退出程序 */ private static void startMoniter() { ServerSocket server = null; BufferedReader br = null; try { server = new ServerSocket(); server.bind(new InetSocketAddress("127.0.0.1", 8888)); } catch (Exception e) { System.out.println("綁定端口失敗"); } try { while(true){ Socket sock = server.accept();//這里會阻塞,直到收到命令 sock.setSoTimeout(1000); //本地通信設置較短時間 br = new BufferedReader(new InputStreamReader(sock.getInputStream())); String readContent = br.readLine(); System.out.println("接收到的內容是:"+readContent); // 判斷收到信息是否是停止標志 if ("stop".equals(readContent)) { System.out.println("應用程序準備停止"); forceExit = true;//修改變量值,退出程序 } br.close(); sock.close(); } } catch (Exception e) { System.out.println(e.getMessage()); } } private static class MessageHandler implements Runnable{ @Override public void run() { while(!forceExit){ try{ //1.從消息隊列中取出數據 //2.根據消息內容,執行相應業務 System.out.println("處理業務中..."); Thread.sleep(1000); }catch (Exception e) { //donothing } } System.out.println("應用程序停止成功"); System.exit(0);//關閉程序,退出JVM } } public static void main(String[] args) { Thread workThread = new Thread(new MessageHandler()); workThread.start();//工作線程開始工作 startMoniter();//開啟監聽器,用于關閉程序 } }
客戶端程序,用于向服務端程序發送關閉命令(stop)
public class AppCloseHelper { public static void main(String[] args) { String targetHost = "127.0.0.1"; int targetPort = 8888; try { Socket socket = new Socket(targetHost, targetPort); PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter( socket.getOutputStream()))); pw.println("stop");//發送停止命令 pw.flush(); socket.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
控制臺輸出的內容為:
處理業務中...
處理業務中...
處理業務中...
接收到的內容是:stop
應用程序準備停止
應用程序停止成功
通過向指定端口發送命令來實現關閉程序,實現比較簡單,但安全性不高,如果被別人知道了這個端口以及關閉命令,就可以隨時關閉正在運行的程序了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64022.html
摘要:上,數據按有限大小的包傳輸,這些包成為數據報,每個數據報包含一個首部和一個有效載荷。不過,由于數據報長度有限,通常必須將數據分解為多個包,再在目的地重新組合。這兩個構造函數,在返回之前會與遠程主機建立一個活動的網絡連接。 Internet上,數據按有限大小的包傳輸,這些包成為數據報(datagram),每個數據報包含一個首部(header)和一個有效載荷(payload)。首部包含包發...
摘要:時間年月日星期六說明本文部分內容均來自慕課網。這個時候,可以啟動多臺積分系統,來同時消費這個消息中間件里面的登錄消息,達到橫向擴展的作用。 時間:2017年07月22日星期六說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:無學習源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程安排 Java...
摘要:每個可以創建一個線程池,但是可以在以及其他組件之間共享,只要那些組件配置之后支持。線程池最大活躍線程數量,默認。如果配置了組件防止泄露的監聽器,它會通知停止環境。如果未指定此屬性,會使用一個私有的內部來提供線程池。 概覽 Tomcat7作為Servlet/JSP容器,它的全部行為的配置指令,包含在/conf/server.xml文件中,這個文件是一個無預定義結構的XML文件,所有的屬性...
摘要:被設計為這樣一種方式,父進程必須明確地等待子進程終止,以便收集它的退出狀態。會完成的刪除,將優雅退出的時間設置為表示立即刪除。 SIGINT SIGTERM SIGKILL區別 三者都是結束/終止進程運行。 1.SIGINT SIGTERM區別 前者與字符ctrl+c關聯,后者沒有任何控制字符關聯。前者只能結束前臺進程,后者則不是。 2.SIGTERM SIGKILL的區別 前者可以被...
閱讀 1228·2021-11-15 11:37
閱讀 2246·2021-09-30 09:55
閱讀 4483·2021-09-22 15:51
閱讀 3741·2021-09-22 15:46
閱讀 2766·2019-08-30 15:52
閱讀 423·2019-08-29 16:20
閱讀 2889·2019-08-29 15:12
閱讀 1130·2019-08-26 18:27