当前位置: 首页 > 知识库问答 >
问题:

如何在调用JVM的关闭钩子之前关闭@SpringBootTest上下文(一次,在所有JUnit测试之后)

卜瀚漠
2023-03-14

在JUnit 5停止JVM(调用添加了addShutdown Hook()的钩子)之前,如何关闭Spring Boot上下文,通过用@SpringBootTest注释测试类来创建?


假设这样的bean

@Component
public class SomeBean implements DisposableBean {

    public SomeBean() {
        var hook = new Thread(() -> System.out.println("Shutdown Hook called"));
        Runtime.getRuntime().addShutdownHook(hook);
    }

    @Override
    public void destroy() {
        System.out.println("Destroy called");
    }
}

一个简单的JUnit 5测试如下:

@SpringBootTest
class TestJvmShutdownHookApplicationTests {

    @Test
    void contextLoads() {
    }

}

如何在JVM关闭挂钩之前执行对destroy()的调用?

2021-02-18 13:54:24.540  INFO 18928 --- [           main] .a.t.TestJvmShutdownHookApplicationTests : Started TestJvmShutdownHookApplicationTests in 2.378 seconds (JVM running for 3.687)
Shutdown Hook called
2021-02-18 13:54:24.863  INFO 18928 --- [extShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'
Destroy called

背景it。ozimov:embedded redis添加了一个JVM关闭钩子,并在beanredisConnectionFactory(莴苣)被销毁之前关闭redis服务器。

共有1个答案

万博涛
2023-03-14

目前还没有实现这一目标的内置支持。

有关更多详细信息,请参阅Spring framework的问题跟踪程序中的“在所有测试执行完毕后关闭TestContext框架中的所有ApplicationContext”问题。

目前,正确关闭Spring TestContext框架缓存ApplicationContext的唯一方法是通过@DirtiesContext或调用TestContext#markApplicationContextDirty(…)的自定义TestExecutionListener

 类似资料:
  • 在使用Hibernate和Jpa的spring boot应用程序中,我需要在saveAll()之前关闭select,以提高高记录数的性能。 我找到了一个使用JPQL的方法,性能很好(在30s内删除+保存10k条记录),但我希望继续使用hibernate和JPA。 我的期望是,当我运行用Java编写的代码时,我必须删除一个表的所有记录,然后保存另一个表的所有记录。当我以经典的方式(deleteAll

  • 主要内容:1 什么是Java 关闭钩子,2 JVM什么时候关闭,3 Java 关闭钩子的语法,4 Java 关闭钩子的例子,5 Java 关闭钩子的例子:匿名类1 什么是Java 关闭钩子 当JVM正常或突然关闭时,shutdown关闭钩子可用于执行清理资源或保存状态。例如:关闭日志文件,发送一些警报或其他内容。因此,如果要在JVM关闭之前执行一些代码,请使用shutdown关闭钩子。 2 JVM什么时候关闭 以下情况,JVM将关闭: 用户在命令提示符下按ctrl + c 调用System.ex

  • 我有一个使用子/父上下文关系的Spring应用程序。这样做的原因是为了确保子上下文从父上下文继承bean/资源,然后根据需要添加更多bean/资源来覆盖它们。但是,当子上下文关闭时(退出try/catch作用域),它开始对它引用的所有bean进行清理,包括父作用域中的bean。这是不可取的,因为我需要重用父上下文来创建另一个子上下文,但是现在它是垃圾,因为它包含了一堆已处理/关闭的bean。 问题

  • 我有一个Spring启动应用程序。 我已经在我的bean中实现了接口,它在它的方法中启动异步snmp服务器,并在它的方法中停止它。 除了主应用程序上下文在启动后立即停止,所以我的服务器bean也在启动后立即停止之外,所有这些都可以正常工作。 我只需要让spring上下文仅在启动shutdown hook时停止。 这不是一个web应用程序,所以我不需要,它通过启动webserver来解决这个问题,w

  • 代码: 我有上面的代码来并行执行一些任务。考虑到已经让调用线程等待完成,不知道它是否应该是而不是块中的。 注意:仅从输入列表中读取。

  • 问题内容: 背景 我正在客户端使用HTTP流(服务器推送)情况下的响应。尽管服务器可以通过关闭响应来关闭连接,但是客户端也需要这样做。 问题 客户端在一个单独的线程中处理,如下所示: 因此,当我从发起连接的线程进行调用时(重要的信息是它与处理输入的线程不同),该调用将无限期挂起。我什至把它留了一夜,它仍然挂着。即使打电话也无济于事。 有什么建议吗? 问题答案: 在没有可用字节的情况下,如果不更改读