CDI는

2014-10-22 15 views
0

내가 주석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는 응용 프로그램 시작에 생성되어야하며, 응용 프로그램이 중지 될 때 종료 될 경우

답변

1

, 바로 다음을 수행하십시오

@ApplicationScoped 
@Startup 
public class AnyNameForYourApplicationClass { 

    @PostConstruct 
    public void connectDB() { 
    // creates the db connection at startup 
    } 

    @PreDestoy 
    public void disconnectDB() { 
    // disconnects from the db 
    } 
} 

이 그것을해야한다. 또는 CDI 제작자를 사용하여 응용 프로그램 범위 db 연결을 만들 수도 있습니다. 그런 다음 disposer 메소드를 사용하여 db와의 연결을 끊을 수 있습니다.

웹 수신기를 호출 할 때 응용 프로그램이 여전히 살아 있어야하므로 문제가 발생합니다. @PreDestroy가있는 shutdownDB 메소드는 응용 프로그램 범위 Bean이 파기 될 때 나중에 호출됩니다. 그리고 청취자가 그것을 참조하기 때문에 청취자가 파괴 될 때까지 살아 있어야합니다.

+0

내 경우에도 PreDestroy가 Poblem을 해결해 주셔서 감사합니다. 내가 왜 주석을 가지고 이해할 수 없었 는가? ApplicationScoped 공용 클래스 DbGraphConnectionLocator가 ServerStopTask {....}를 구현하지만 contextDestoyed가 호출되었지만 사용 된 객체가 원래 객체가 아닙니다. 시작시 생성 된 DbGraphConnectionLocator – Antimo