Jax-ws @PreDestroy什么时候被完全调用?

时间:2011-04-20 15:26:28

标签: java annotations jax-ws

我使用@PostConstruct@PreDestory注释提供简单的网络服务。

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

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

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

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

但在阅读了一些在线资源后,我感到困惑。有人说@PreDestroy会在未展开时被调用吗?

1 个答案:

答案 0 :(得分:7)

@PreDestroy仅在应用程序服务器决定减小方法就绪池的大小时调用 - 即它确定它不需要保留@WebService @Stateless会话bean的大量实例。每次调用@WebMethod后都不会调用它(只有在将新实例添加到Method-ready池时才会调用@PostConstruct,而不一定在每个Web方法调用之前调用{.1}}。 p>

如果您需要在每次方法调用之前和之后调用逻辑,则可以按如下方式执行:

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

此方法可以使用@WebService

添加到您的@Interceptors bean或单独的类中