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