摘要:可以实现把一个程序包装成后台服务的功能。另一种简单方法是在程序启动后监听一个指定端口,需要停止程序时,通过协议向该端口发送关闭命令即可。
在操作系统中,有一些应用程序是以后台服务形式运行的,如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
应用程序准备停止
应用程序停止成功
通过向指定端口发送命令来实现关闭程序,实现比较简单,但安全性不高,如果被别人知道了这个端口以及关闭命令,就可以随时关闭正在运行的程序了。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/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的区别 前者可以被...
阅读 1202·2021-11-15 11:37
阅读 2218·2021-09-30 09:55
阅读 4335·2021-09-22 15:51
阅读 3691·2021-09-22 15:46
阅读 2746·2019-08-30 15:52
阅读 404·2019-08-29 16:20
阅读 2787·2019-08-29 15:12
阅读 1102·2019-08-26 18:27