Jax-ws @PreDestroy Когда он вызывается точно? - PullRequest
2 голосов
/ 20 апреля 2011

У меня есть простой веб-сервис, использующий аннотации @PostConstruct и @PreDestory.

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

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

тогда клиент вызовет некоторые веб-методы для выполнения некоторых операций с базой данных.Я сделал простое тестирование, установив точки останова в коде.@PostConstruct работает отлично.но метод @PreDestroy никогда не вызывается.

Я думал, что @PreDestroy всегда будет вызываться, когда клиент заканчивает вызывать веб-метод, поскольку веб-служба по своей природе не имеет состояния.Таким образом, в конце концов, экземпляр всегда уничтожается, и до этого мой метод освобождения должен быть вызван?Это правильное понимание?

Но после прочтения некоторых онлайн-ресурсов я запутался.некоторые говорят, что @PreDestroy будет вызываться, когда он не развернут?

1 Ответ

7 голосов
/ 20 апреля 2011

@PreDestroy вызывается только тогда, когда сервер приложений решает уменьшить размер пула Method-Ready - т.е. он определяет, что ему не нужно хранить столько экземпляров вашего @WebService @Stateless сессионного компонента.Он не вызывается после каждого вызова @WebMethod@PostConstruct вызывается только при добавлении нового экземпляра в пул готовности к методу, необязательно перед каждым вызовом веб-метода).

Если у вас есть логика, которую нужно вызывать до и после каждого вызова метода, вы можете сделать это следующим образом:

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

Этот метод может быть добавлен к вашему бину @WebService или в виде отдельного класса, используя @Interceptors

...