我有一个使用@PostConstruct@PreDestory批注的简单Web服务。

@PostConstruct
private void init() {...} //initialize some database connection

@PreDestroy
private void release() {...} //release data base resources


然后客户端将调用某些Web方法来执行一些数据库操作。我通过在代码中设置断点进行了简单的测试。 @PostConstruct正常工作。但是@PreDestroy方法永远不会被调用。

我认为@PreDestroy总是在客户端完成调用Web方法时被调用,因为Web服务本质上是无状态的。所以最后,实例总是被销毁,在此之前,应该调用我的发布方法?这是正确的理解吗?

但是在阅读了一些在线资源后,我感到困惑。有人说@PreDestroy取消部署时会被调用吗?

最佳答案

仅当应用程序服务器决定减小Method-Ready池的大小时,才会调用@PreDestroy-即,它确定不需要保留尽可能多的@WebService @Stateless会话bean实例。每次调用@WebMethod后,它都不会被调用(并且@PostConstruct仅在将新实例添加到“方法就绪”池中时才调用,而不必在每次调用Web方法之前)。

如果您有逻辑,则需要在每次方法调用之前和之后调用它,如下所示:

@AroundInvoke
public Object intercept( InvocationContext ctx )
{
  try
  {
    init();
    return ctx.proceed();
  }
  finally
  {
    release();
  }
}


可以将此方法添加到您的@WebService bean中,或使用@Interceptors作为单独的类添加。

07-24 19:30
查看更多