`
tessykandy
  • 浏览: 78985 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

基于kill信号优雅的关闭JAVA程序

    博客分类:
  • JAVA
阅读更多

    linux下其他jar包

# java -jar program.jar &

   当要停止程序时很多人先会考虑使用 kill -9 $pid ,强制程序退出,这有可能造成程序处理进程被半路中断,造成写入数据不完整。为了能优雅的退出,考虑通过捕捉USR2信号安全退出,以HttpServer为例。

package com.uar.daemon;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;

import sun.misc.Signal;
import sun.misc.SignalHandler;

import com.sun.net.httpserver.HttpServer;
import com.uar.bean.ConfigSetting;

public class HttpServerTest implements SignalHandler {
	
	private static Logger logger = LogManager.getLogger(HttpServerTest.class);
	
	private HttpServer server;
	private ExecutorService httpThreadPool;
	
	@Override
	public void handle(Signal sn) {
		logger.info("Signal [" + sn.getName() + "] is received, stopServer soon...");
		stopServer();
		logger.info("Stop successfully.");
	}
	
	public static void main(String[] args){
		HttpServerTest main = new HttpServerTest();
		// 捕捉USR2信号
		Signal.handle(new Signal("USR2"), main);
		main.startServer();
	}
	
	public void startServer() {
		int port = 5555;
		String context = "/KillTest";
		int maxConnections = 50;
		try {
			InetSocketAddress addr = new InetSocketAddress(port);
			server = HttpServer.create(addr, maxConnections);
			
			server.createContext(context, new ServerHandler());
			httpThreadPool = Executors.newCachedThreadPool();
			server.setExecutor(httpThreadPool);
			server.start();
		} catch (IOException e) {
			logger.error(e);
		}
	}	
	
	/**
	 * 安全的关闭HttpServer监听服务
	 */
	private void stopServer() {
		server.stop(1);
		httpThreadPool.shutdown();
	}
}

 

server.stop()

stop

public abstract void stop(int delay)
stops this server by closing the listening socket and disallowing any new exchanges from being processed. The method will then block until all current exchange handlers have completed or else when approximately delay seconds have elapsed (whichever happens sooner). Then, all open TCP connections are closed, the background thread created by start() exits, and the method returns. Once stopped, a HttpServer cannot be re-used.
Parameters:
   delay - the maximum time in seconds to wait until exchanges have finished.
Throws:
   IllegalArgumentException - if delay is less than zero.

 

    

分享到:
评论

相关推荐

    Linux 环境如何使用 kill 命令优雅停止 Java 服务.pdf

    Linux 环境如何使用 kill 命令优雅停止 Java 服务,超详细讲解与例子!

    Java通过进程名称杀进程

    实现Java通过进程名称杀进程,列子中主要实现在windows操作系统中,将进程名称为java-test.exe的进程kill掉。

    VB杀死KILL进程的实例程序.rar

    VB杀死KILL进程的实例程序,程序运行后,指定某一个需要关闭的进程,可强制关闭其进程,杀死进程相关的线程,其实比较简单的方法,请细看代码吧。

    kill.cmd关闭红蜘蛛

    kill.cmd关闭红蜘蛛

    VB的kill删除功能程序(VB6.0源代码编写)

    VB的kill删除功能程序(VB6.0源代码编写)

    重启java程序shell脚本

    linux中java项目需要重启一般使用先找到进程杀掉进程,然后找到项目启动,整个过程不算复杂,但是每次都操作一遍太麻烦,我这里把这个过程整理成shell脚本,大家可以修改里面项目名称,每次直接执行这个命令重启项目...

    信号量机制实验

    编写一段程序,使用系统调用fork( )创建两个子进程,再用系统调用signal( )让父进 程捕捉键盘上来的中断信号(即按ctrl+c键),当捕捉到中断信号后,父进程用系统调用kill( )向两个子进程发出信号,子进程捕捉到信号...

    VB的kill删除功能程序(VB6.0代码编写)

    VB的kill删除功能程序(VB6.0代码编写) VB的kill删除功能 QQ223857666勾月

    pskill_cmd结束程序

    在CMD中直接结束想要的进程,使用如下 pskill.exe -t cmd.exe(这样就是结束一个叫CMD.EXE的进程)

    自动关闭无响应程序Kill Frozen Programs中文版.rar

    Kill Frozen Programs绿色汉化版能够自动终止系统中无响应的应用程序进程,需要先设置好终止无响应程序的组合键,即全局热键,按下热键后即可自动关闭因各种原因引起的无响应的应用程序,适合无法使用Ctrl Alt ...

    C#Form1_FormClosing_强制关闭程序进程

    关闭程序时,后台进程无法关闭,采用kill的方式关闭。

    windows-kill:在Windows中通过PID发送信号进行处理,例如POSIX kill

    在Windows中通过PID发送信号进行处理,例如POSIX kill Windows没有像kill命令那样的POSIX提供的进程信令机制。 但是Windows-kill可以通过PID发送信号进行处理。 :) 为什么要用Windows杀死? 好吧,我是一个node.js...

    kill命令使用

    Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令。通常,终止一个前台进程可以使用...对于那些可以捕获该信号的进程就要用编号为9的kill信号,强行“杀掉”该进程。

    MFC 强制关闭指定进程 强制关闭指定窗口

    MFC 强制关闭指定进程 强制关闭指定窗口 输入任务管理器中你想要关闭的进程名或者窗口名 点关闭或结束按钮即可

    delphi下实现应用程序掉线关闭后自动重启

    1,保证无毒;2.简单易用 3.创建线程自动侦测掉线程序 4.能自动重启掉线程序

    windows进程关闭kill的工具,非常强大

    windows进程关闭kill的工具,非常强大, 支持者请使用,非常实用的,对本人有什么需要求, 请提问,本人可以帮助你解决。

    KILL杀毒软件 8.1

    KILL杀毒软件是冠群金辰公司最新推出的桌面防病毒软件,可全面查杀病毒、蠕虫、木马等恶意代码,保护PC用户的系统和信息安全。KILL采用具有国际领先水平的自有防病毒引擎,拥有雄厚的技术服务实力,可向用户提供优质...

    kill命令在Java应用中使用的注意事项小结

    主要给大家介绍了关于kill命令在Java应用中使用的注意事项,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    杀java进程

    作用:专门杀java进程。 在开发码代码时:刚写的代码打包,编译无效,无需重启电脑,直接运行此文件可以杀java进程,然后在重新编译,打包解决编译无效的事情。

Global site tag (gtag.js) - Google Analytics