`
tessykandy
  • 浏览: 80923 次
  • 性别: 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

    本文将详细介绍如何使用kill命令在Linux环境下优雅地停止Java服务,包括介绍相关的命令行工具和信号机制。 首先,需要了解的是,当我们在Linux系统中运行Java服务时,这些服务以进程形式存在。一旦需要停止这些服务...

    Java通过进程名称杀进程

    本文将详细介绍如何使用Java代码实现基于进程名称的进程终止功能,特别是针对Windows操作系统下的`java-test.exe`进程。这不仅适用于开发者调试自身程序时的需求,也适用于系统管理员批量管理运行在Windows服务器上...

    C#关闭外部程序

    在C#编程中,关闭外部程序是一个常见的任务,特别是在系统集成、自动化测试或者需要管理其他应用程序的状态时。本文将深入探讨如何使用C#来实现这一功能,并提供相关的知识点。 首先,我们要了解C#中用于与操作系统...

    启动,停止某个某个java程序

    在IT行业中,管理和控制Java应用程序的生命周期是日常工作中常见的任务之一。本文将深入探讨如何启动和停止特定的Java程序,以及相关工具和技术的应用。这里提到的"启动,停止某个Java程序",通常涉及到命令行操作,...

    C# 关闭指定的程序

    在C#编程中,关闭指定程序是一个常见的任务,这通常涉及到进程管理。下面将详细讲解如何使用C#来实现这一功能,以及相关的知识点。 首先,我们需要了解基础的进程概念。在计算机系统中,进程是程序的执行实例,每个...

    Go-Death-利用信号管理Go应用程序关闭

    例如,`SIGINT`(Ctrl+C)和`SIGTERM`(由kill命令发送)是常见的用于请求程序关闭的信号。 Death库,如压缩包文件名所示,可能是为了解决这个问题而创建的一个工具。它可能提供了一种简洁的方式来管理和响应这些...

    vb.net关闭应用程序的代码

    在VB.NET编程环境中,关闭应用程序是一项常见的操作,无论是退出整个应用程序还是关闭单个窗口。本文将深入探讨如何在VB.NET中实现这一功能,并提供具体的代码示例,以关闭指定的应用程序,例如QQ。同时,我们将讨论...

    C#关闭应用程序进程

    - **使用`Process.Kill()`**:适用于需要强制关闭进程的情况,例如应用程序出现严重错误无法正常退出。 - **使用`Application.Exit()`**:适用于需要优雅退出应用程序的情况,允许应用程序执行清理工作。 - **使用`...

    如何在程序中关闭其他程序

    Python提供了一个名为`os`的内置模块,其中包含`os.kill()`函数,可以用来发送信号到指定进程,从而关闭它。例如,要获取进程ID(PID)并关闭它,你可以这样做: ```python import os import psutil def kill_...

    8种启动java程序的方法

    ### 8种启动Java程序的方法 在日常的开发与运维工作中,启动Java应用程序是一项基本而重要的操作。不同的启动方式有着各自的适用场景与优缺点。本文将详细介绍以下8种启动Java程序的方法: #### 1. 使用 `-...

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

    "VB杀死KILL进程的实例程序"就是一个这样的应用,它允许开发者指定一个进程,并强制结束该进程及其相关的线程。在这个实例中,我们将深入探讨如何使用VB来实现这个功能。 首先,我们要了解在VB中如何获取系统进程的...

    标准后台程序kill 重启脚本.

    优雅关闭允许程序清理资源,保存状态,并确保在退出前完成任何未完成的工作。通常,`kill.sh`会使用`pgrep`或`ps`命令找到对应进程的PID,然后使用`kill`命令发送信号。 `restart.sh`:重启脚本结合了`start.sh`和`...

    C#在程序中关闭其他程序

    在C#编程中,有时我们需要实现一个功能,即在自己的应用程序中关闭其他的程序。这个功能在系统管理和自动化脚本中非常常见,例如监控特定进程、优化系统资源等场景。本文将详细讲解如何在C#中实现这个功能。 首先,...

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

    在Java应用中,`kill`命令的使用是一个关键的操作,特别是在需要优雅地关闭或调试程序时。`kill`命令在Linux系统中被广泛用来发送信号给进程,使其执行特定的操作,如停止、重启或者获取状态。本文将详细介绍`kill`...

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

    在VB6.0中,`Kill`函数是一个用于删除文件的关键功能,它允许开发者编写程序来执行文件的删除操作。这个程序示例很可能是展示如何在Visual Basic环境中使用`Kill`函数来删除指定的文件。下面我们将深入探讨`Kill`...

    c# winform 定时开启关闭小程序

    要关闭程序,我们首先需要获取到`Process`对象,然后调用`Process.CloseMainWindow()`或`Process.Kill()`方法,取决于我们是否希望优雅地关闭(前者)还是立即强制结束(后者)。 为了读取和保存配置,我们可以利用...

    C# 关闭进程 KillProcess

    "C# 关闭进程 KillProcess"这个话题涉及到的就是如何使用C#编程语言来实现这一功能,特别是通过进程的PID(Process ID,进程标识符)来关闭指定的进程。下面我们将深入探讨这一主题。 首先,PID是Windows操作系统为...

    NextDate(java)

    6. **文件名称列表**:提供的压缩包中有一个名为"Kill Task.vi"的文件,但它与标题和描述中的Java程序似乎无关。这可能是另一个项目或任务,例如在LabVIEW(一种图形化编程环境)中创建的程序,因为".vi"是LabVIEW...

    test_pthread_kill测试程序_

    3. 发送信号:在测试程序中,我们可以调用`pthread_kill`函数,向目标线程发送信号。这可以测试线程是否能正确接收并处理信号。 4. 检查结果:在信号处理函数中,我们可以记录线程接收到信号的情况,并在测试结束后...

Global site tag (gtag.js) - Google Analytics