问题标签 [predestroy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
630 浏览

jsf - @PreDestroy 有时在@PostConstruct 之后直接调用一次,有时在再次触发 GET 时调用两次

我目前在 Mojarra 2.2.14 中遇到了 @PreDestroy 方法的奇怪问题:行为似乎是某种未定义的。有时在@PostConstruct 之后直接调用一次,有时在再次触发 GET 时调用两次。离开当前页面时相同:有时会调用 clear(),但大多数时候不会。另一方面,@PostConstruct 按预期工作。

结果是,ProductDetailBean 的所有字段都为空,因此调用页面“productDetails.xhtml”。

关于@PreDestroy 有一些已知问题吗?如果有人能提供一些有用的信息,那就太好了。什么是合适的解决方法?这个 bean 有很多字段,我非常有兴趣在用户离开页面时清除所有内容。

可悲的是,我现在无法更改为 CDI-Beans ......

0 投票
2 回答
2186 浏览

java - 如何为使用 @Bean 注释声明的 bean 调用 @PreDestroy

我有一个用注释@Bean 声明的bean

在销毁 bean 时,我有一些操作要执行。我怎样才能做到这一点?

我知道我可以在使用 @Component 注释的类中的方法上使用 @predestroy 注释,但不确定在声明 @Bean 注释时如何做到这一点。

编辑 :

但是我收到一个错误,在名称为“容器”的 bean 上找不到名为“stopContainers”的销毁方法如何解决这个问题?

0 投票
1 回答
1334 浏览

java - 为什么 PreDestroy 方法不起作用

我有一个配置简单的基本 spring 项目。这是豆

配置:

这是我的测试代码:

当我运行此代码时,我看不到日志中的销毁方法以及上下文关闭。

我试图打电话registerShutdownHookrefresh但结果是一样的。

0 投票
2 回答
15795 浏览

java - Spring原型bean是否需要手动销毁?

我注意到@PreDestroy我的原型范围 Spring bean 的钩子没有被执行。

从那以后,我在这里读到这实际上是设计使然。Spring 容器将销毁单例 bean,但不会销毁原型 bean。我不清楚为什么。如果 Spring 容器将创建我的原型 bean 并执行它的@PostConstruct钩子,为什么当容器关闭时它不会破坏我的 bean?一旦我的 Spring 容器关闭,继续使用它的任何 bean 是否有意义?我看不到您想要在完成其 bean 之前关闭容器的场景。在容器关闭后是否可以继续使用原型 Spring bean?

以上描述了我的主要问题的令人费解的背景,即:如果 Spring 容器没有破坏原型 bean,这是否意味着可能发生内存泄漏?或者原型bean会在某个时候被垃圾收集吗?

Spring 文档指出:

客户端代码必须清理原型范围的对象并释放原型 bean 持有的昂贵资源。要让 Spring 容器释放原型范围的 bean 持有的资源,请尝试使用自定义 bean 后处理器,它包含对需要清理的 bean 的引用。

这意味着什么?文本向我表明,作为程序员,我有责任明确(手动)销毁我的原型 bean。这个对吗?如果是这样,我该怎么做?

0 投票
2 回答
1378 浏览

java - 使用 @PreDestroy 关闭 @Bean ExecutorService

我有一个 Spring @Configuration 类,如下所示:

我还想指定一个@PreDestroy关闭 ExecutorService 的方法。但是,该@PreDestroy方法不能有任何参数,这就是为什么我无法将executorbean 传递给该方法以关闭它的原因。指定destroy方法@Bean(destroyMethod = "...")也不起作用。它允许我指定现有的shutdownor shutdownNow,但不能指定我打算使用的自定义方法。

我知道我可以直接实例化队列和执行程序,而不是作为 Spring bean,但我宁愿这样做。

0 投票
1 回答
799 浏览

spring-boot - 在 sigkill 上进行 Spring Boot 清理

我正在运行一个 SpringBoot 应用程序。我使用 @PreDestroy 注释添加了一些清理操作。当我使用 SIGTERM 终止进程时,它是 tomcat 的 kill ${PID},它通过调用标有@PreDestroy 的方法来执行所有清理任务。但是,当我使用 SIGKILL 即 kill -9 ${PID} of tomcat 时,不会执行清理。

有什么方法可以让应用程序在使用 SIGKILL 终止时执行所有预销毁工作?

0 投票
2 回答
819 浏览

spring - 如果我们在 @PostConstract 中获得异常,是否授予 @PreDestroy 方法调用

我有 SpringBoot 应用程序,它加载一些配置并在使用 @PostConstract 注释的方法中运行长时间处理。如果应用程序成功完成或出现错误,则应释放一些资源。

问题是如何最正确地释放应用资源?这是否足以在 @PreDestroy 注释方法中实现,或者我还应该在 @PostConstract 注释方法中捕获异常。

0 投票
1 回答
682 浏览

java - Kafka 在 Spring Boot 关闭之前手动确认

所以这个问题很简单,但我现在很长一段时间都找不到答案。

我对我的 Kafka 消费者进行了手动确认,在应用程序关闭之前,我想执行一些代码,然后向 Kafka 确认。所以为此我使用@PreDestroy 注释:

现在主要问题是 Kafka 消费者在执行此操作之前已关闭,因此消息实际上并没有得到确认,并且在我启动应用程序时我再次收到它们,所以我需要某种解决方法或另一种方法来指定此功能作为关机前调用的第一件事。可以在日志中看到这一点的证明:

如果有人有建议,请告诉。

0 投票
1 回答
232 浏览

interceptor - JEE:如何拦截@PostCostruct 方法?

我有一个豆子:

  • void initialize()用 注释的方法@PostConstruct
  • void release()用 注释的方法@PreDestroy
  • 其他一些方法。
  • 此外,该 bean 具有@Interceptors定义一些拦截器的注释。

其中一个拦截器具有注释的方法

  • @AroundConstruct
  • @AroundInvoke
  • @AroundTimeout
  • @PostConstruct
  • @PreDestroy

在这些方法中的每一个中,我都添加了一些日志记录,因此我可以查看调用了哪些拦截器方法以及何时调用了拦截器方法。调用顺序如下所示:

  • 输入拦截器的@AroundConstruct方法。InvocationContext:目标是null,方法是null,构造函数已设置。
  • 调用 Beans 构造函数。
  • 该调用通过 Interceptor 的@AroundConstruct方法存在。InvocationContext:Target 是 bean 实例,method 是null,构造函数是 set。
  • 拦截器的@PostConstruct方法被调用,调用proceed()并返回。InvocationContext:Target 是 bean 实例,method 是null,构造函数是 set。
  • 在上一次调用完全返回之后,调用 bean 的@PostConstruct方法。

我很惊讶地意识到,@PostConstruct不是在 bean 的@PostConstruct方法调用期间调用,而是在 bean 的构造和调用 bean 的@PostConstruct方法之间调用。此外,bean@PostConstruct方法的调用根本不会被拦截,不会被拦截器的@PostConstruct方法或bi它的@AroundInvoke方法拦截。

我/我的程序方面有什么错误吗?

有没有办法拦截bean的@PostConstruct方法(方法也是如此@PreDestroy)?

我需要准备上下文并用一些内容填充它们。此外,稍后调用堆栈深处的其他方法也可以知道调用是由容器通过这两种方法之一触发的。

0 投票
2 回答
425 浏览

java - @PostConstruct 和 @PreDestroy 的 Spring 问题

我有一个 Spring 应用程序,我正在尝试使用 EmbededRedis 进行测试。所以我创建了一个像下面这样的组件来初始化并在测试后杀死redis。

但现在我面临一个奇怪的问题。因为 spring 缓存了上下文,所以 PreDestroy 不会在我的测试执行后每次都被调用,但是由于某种原因,@PostConstruct 会被调用,并且 EmbededRedis 会一次又一次地尝试启动正在运行的 redis 服务器,这在执行过程中会产生问题。

有没有办法以任何方式处理这种情况?

更新 这就是我主要定义我的测试的方式。