내가 주석CDI는
@ApplicationScoped
public class DbGraphConnectionLocator implements ServerStopTask {
...
}
이 객체 내장 데이터베이스를 생성하여 객체에서이 @ApplicationScoped.
응용 프로그램을 다시 배포 할 때 종료 데이터베이스에 후크를 만들려고했습니다.
그래서 내가 클래스 사실@WebListener
public class UndeployHook implements ServletContextListener{
@Inject
DbGraphConnectionLocator dbGraphConnectionLocator;
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
try {
dbGraphConnectionLocator.executeStopTask();
} catch (Exception e) {
e.printStackTrace();
}
}
}
에게 contextDestoyed가 호출되는 방법을 구성하지만, 사용되는 객체는 시작에서 만든 원래 DbGraphConnectionLocator 아니다, 이것은 나에게 몇 가지 문제를 일으키는 것입니다. DbGraphConnectionLocator의 인스턴스가 응용 프로그램 수준에서 고유해야
@ApplicationScoped
public class DbGraphConnectionLocator implements ServerStopTask { ....}
주석과 제 생각에는
그래서 나는 내가 만든 동일한 인스턴스를 발견 할 가지고
@Inject
DbGraphConnectionLocator dbGraphConnectionLocator;
와 함께 사용할 때 내 응용 프로그램에 의해 시작하지만 이것은 사실이 아니며 다른 인스턴스가 만들어졌습니다.
어쨌든 난 DbGraphConnectionLocator에@PreDestroy
public void shutdownDB(){
graphDb.shutdown();
}
를 추가 해결. 정보를 보려면이 메소드가 contextDestroyed 메소드 다음에 호출되는 것을 볼 수 있습니다. 즉, contextDestroyed가 호출 될 때 원래 인스턴스가 여전히 존재하므로, 뭔가를 놓친다는 것을 의미합니다 ....
모든 힌트가 필요합니까? 임베디드 DB는 응용 프로그램 시작에 생성되어야하며, 응용 프로그램이 중지 될 때 종료 될 경우
내 경우에도 PreDestroy가 Poblem을 해결해 주셔서 감사합니다. 내가 왜 주석을 가지고 이해할 수 없었 는가? ApplicationScoped 공용 클래스 DbGraphConnectionLocator가 ServerStopTask {....}를 구현하지만 contextDestoyed가 호출되었지만 사용 된 객체가 원래 객체가 아닙니다. 시작시 생성 된 DbGraphConnectionLocator – Antimo