标签: shutdown-hook

Java中关闭钩子的有用示例?

我正在努力确保我的Java应用程序采取合理的步骤来保持健壮,其中一部分涉及优雅地关闭.我正在阅读有关关闭钩子的事情,我实际上并没有在实践中如何使用它们.

那里有一个实际的例子吗?

Let's say I had a really simple application like this one below, which writes numbers to a file, 10 to a line, in batches of 100, and I want to make sure a given batch finishes if the program is interrupted. I get how to register a shutdown hook but I have no idea how to integrate that into my application. Any suggestions?

package com.example.test.concurrency;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;

public class GracefulShutdownTest1 …
Run Code Online (Sandbox Code Playgroud)

java shutdown-hook

121
推荐指数
1
解决办法
13万
查看次数

关闭挂钩在Eclipse中不起作用

我添加了一个关闭钩子:

Runtime.getRuntime().addShutdownHook(myShutdownHook);
Run Code Online (Sandbox Code Playgroud)

它正常工作正常,但是当我单击Eclipse中的红色停止按钮时则不行.有没有办法在Eclipse中调用关闭钩子?

java eclipse shutdown-hook

25
推荐指数
2
解决办法
2万
查看次数

来自PHP中已注册的关闭函数的debug_backtrace()

在修补这个问题的答案的同时,我发现当从内部调用时,debug_backtrace()不会超出注册的函数register_shutdown_function().

这是中提到此评论register_shutdown_function()在PHP文档,指出:

您可以从关闭函数内部调用debug_backtrace或debug_print_backtrace,以跟踪致命错误发生的位置.不幸的是,这些功能在关机功能中不起作用.

更详细地解释一下,对这个答案状态的评论:

不行.堆栈取消后会发生关闭功能.没有要转储的堆栈信息.

有没有办法绕过这个,迫使PHP保持堆栈跟踪直到进程完全终止,或者我们应该接受它作为给定由于PHP内部?

php stack-trace debug-backtrace shutdown-hook

23
推荐指数
4
解决办法
8113
查看次数

从bat脚本运行java应用程序上的Windows关闭挂钩

我有一个运行java应用程序的bat脚本.如果我按下ctrl + c,它会正常终止,调用所有关闭钩子.但是,如果我只关闭bat脚本的cmd窗口,则永远不会调用关闭挂钩.

有办法解决这个问题吗?也许有一种方法可以告诉bat脚本如何在窗口关闭时终止被调用的应用程序?

java windows batch-file application-shutdown shutdown-hook

17
推荐指数
2
解决办法
9370
查看次数

使用"lein run"运行时,shutdown hook不会触发

我有以下代码:

(ns test-hook.core)

(defn -main []
  (.addShutdownHook (Runtime/getRuntime) (Thread. #(println "shutdown")))
  (println "start")
  (doseq [i (range 1 6)]
    (Thread/sleep 1000)
    (println i)))
Run Code Online (Sandbox Code Playgroud)

以及project.clj

(defproject test-hook "1.0.0-SNAPSHOT"
  :aot :all
  :main test-hook.core
  :description "FIXME: write description"
  :dependencies [[org.clojure/clojure "1.2.0"]])
Run Code Online (Sandbox Code Playgroud)

当我使用"lein run"运行它时,关闭钩子仅在正常程序执行时执行,而不是在接收SIGINT时执行(Ctrl-C)

在lein外部运行时相同的代码即使在接收到SIGINT时也会成功执行shutdown hook.

如何从lein运行并使用Ctrl-C中止时执行关闭挂钩?

clojure leiningen shutdown-hook clojure-java-interop

17
推荐指数
1
解决办法
3056
查看次数

Cygwin CTRL-C(信号中断)无法正常工作 - JVM Shutdown Hooks无法启动

我正在开发一个利用关闭挂钩的Java应用程序,以便清除程序的终止/中断,但我注意到Cygwin的CTRL-C实现似乎没有触发关闭挂钩.从表面上看,似乎已中断了该过程,将控制权交还给命令行,但是根本不会触发进程的"关闭"挂钩,因此不会发生清理.

在cmd中它们被捕获,但由于各种约束,我需要以某种方式让它们在Cygwin中工作.

有什么方法可以通过Cygwin在正在运行的进程中触发SIGINT,或者可能是我可以用来清理中断和终止的关闭挂钩的替代方法?

java cygwin interrupt sigint shutdown-hook

16
推荐指数
2
解决办法
4684
查看次数

库关闭例程在"普通"Java应用程序和Web应用程序中运行良好

我维护一个JDBC驱动程序,它也具有通过本机库(通过JNA访问)提供的嵌入式数据库服务器模式.由于卸载其依赖项的顺序,作为卸载本机库本身的一部分完成的关闭在Windows上遇到问题.为了避免访问冲突或其他问题,我需要在卸载此库之前显式关闭嵌入式引擎.

鉴于其使用的性质,很难确定调用shutdown的适当时机,而我现在看到的普通Java应用程序的唯一正确方法是使用实现关闭逻辑Runtime.getRuntime().addShutdownHook的子类来注册一个关闭钩子Thread.

这对于一个普通的Java应用程序工作正常,但对于包括我的库作为应用程序(在部分Web应用程序WEB-INF/libWAR的),这将导致取消部署内存泄漏的关闭钩子将保持强引用我关机实现和Web应用程序的类加载器.

解决这个问题的合适和适当的方法是什么?我现在正在研究的选项是:

  • java.sql.DriverAction.deregister()做清理工作.

    不适合作为驱动程序将不会在正常的应用程序出口上注销.

  • 使用java.sql.DriverAction.deregister()以除去关闭挂钩并执行关机逻辑本身.

    DriverAction鉴于驱动程序仍然支持Java 7,使用有点问题,并且这个类是在JDBC 4.2(Java 8)中引入的.从技术上讲,这并不总是正确使用操作(JDBC驱动程序也可以在现有连接保持有效和正在使用时取消注册),并且可能在未注册javax.sql.DataSourceJDBC java.sql.Driver实现时使用(通过a )驱动程序.

  • 包括使用驱动程序javax.servlet.ServletContextListener注释的实现@WebListener,该实现将删除关闭挂钩并执行关闭逻辑本身.

    如果将驱动程序作为一个整体而不是特定的Web应用程序部署到服务器,则此选项会出现复杂情况(尽管可以解决这些复杂问题).

Java中是否有关闭机制我忽略了它可能适合我的需求?

java servlets jdbc jna shutdown-hook

14
推荐指数
1
解决办法
272
查看次数

Java注释处理:我怎么知道一轮是最后一轮?

扩展时AbstractProcessor,有可能覆盖init(...),但没有"相反"的方法,在处理完所有轮次后调用.

这是一个问题:当你必须将每一轮收集的信息附加到同一个文件时,你就无法关闭文件,因为你永远不会知道最后一轮的时间.因此,文件永远不会关闭并保持为空.

使用关闭钩子也不起作用,永远不会调用钩子.

有任何想法吗?

java annotations annotation-processing shutdown-hook

12
推荐指数
1
解决办法
2179
查看次数

shutdown hook vs finalizer方法

我只是不明白为什么必须使用Runtime.addShutdownHook.如果你想在jvm退出时进行一些清理,为什么不重载守护进程类的finalize方法.使用shutdown hook而不是finalize方法有什么好处.

还有一个不推荐使用的函数runFinalizersOnExit.如果我将其设置为false,我相信终结器将无法运行.这与java保证终结器总是在垃圾收集之前运行相矛盾.

java multithreading finalizer shutdown-hook

12
推荐指数
2
解决办法
3726
查看次数

当脚本从命令行中被杀死时,PHP的register_shutdown_function会被触发?

当从命令行(通过Ctrl + c)或使用kill命令终止cron进程时,是否可以调用函数?

我试过了register_shutdown_function(),但是当脚本被杀死时似乎没有被调用,但是当脚本正常结束时会被调用.

我试图将结果记录到一个文件,并在cron实例被自动终止时更新数据库值(即运行时间太长).

php shutdown-hook

11
推荐指数
1
解决办法
5580
查看次数