2012-06-17 2 views
16

최대 절전 모드가 JBoss AS 7.1에 연결되기 전에 플라이웨이를 응용 프로그램에서 실행하려고했습니다. 나는 @javax.ejb.Startup 주석으로 시도했지만, Hibernate가 초기화되고 데이터베이스 스키마가 점검 된 후에 실행된다.CDI Extension for Flyway

그래서 우리가 이해할 수있는 한, 우리는 Hibernate가 초기화되기 전에 후크하는 CDI 확장을 사용할 수있다. 거기에 대한 flyway에 대한 상자에 대한 몇 가지 지원이 있습니까? 그리고 그렇지 않다면 이전에 누구도 이것을 시도한 적이 있습니까?

+0

: 사람이 자세한 내용에 관심이

public class FlywayIntegrator implements Integrator { @Override public void integrate(final Configuration configuration, final SessionFactoryImplementor sessionFactoryImplementor, final SessionFactoryServiceRegistry sessionFactoryServiceRegistry) { final Flyway flyway = new Flyway(); flyway.setDataSource(....); flyway.migrate(); } @Override public void integrate(final MetadataImplementor metadataImplementor, final SessionFactoryImplementor sessionFactoryImplementor, final SessionFactoryServiceRegistry sessionFactoryServiceRegistry) { //no-op } @Override public void disintegrate(final SessionFactoryImplementor sessionFactoryImplementor, final SessionFactoryServiceRegistry sessionFactoryServiceRegistry) { //no-op } } 

경우에, 나는 것을 보여주는 GitHub의 프로젝트를 생성 일찍이 충분히. 컨테이너 별 인터페이스에 연결해야합니다. 나는 누군가 플라이 웨이 (Flyway)를 위해 그렇게했는지는 모른다. 미안하다. 응용 프로그램 시작 대신 배치 또는 시작 스크립트의 일부로이 작업을 고려한 적이 있습니까? –

+0

@TomAnderson 배포 스크립트에서 이동 경로 동작을 수행 할 것을 고려했지만 명령 줄 이동 경로 도구를 사용해야합니다. 그것은 문서에서 Java Migrations도 지원하는지 명확하지 않습니다. 그래서 시도해야만합니다.) Liquibase로 가능하기 때문에 응용 프로그램 시작시이 방법을 사용할 수 있습니다. https://github.com/aaronwalker/liquibase/commit/5be42a6779b2bef95e2d02d8703aceec91aedb59). 비슷한 것을 시도했지만 불행히도 내 컴퓨터에서 작동하지 않습니다. –

+1

@DominikObermaier 예, 이동 경로 명령 줄은 Java 마이그레이션을 지원합니다./jars 폴더 안에 jar 파일로 제공 될 수 있습니다. –

답변

28

오케이 마침내 이것을 수행하는 방법을 알았습니다. Hibernate Integration API를 사용해야했습니다. 이것은 내가 써야했다 전체 코드입니다 : 내가 일어나는 J2EE 표준 이벤트가 있다고 생각하지 않습니다 https://github.com/dobermai/Hibernate-Flyway-Integration

+1

Dominik 솔루션을 게시 해 주셔서 감사합니다. jboss IRC 채널에서 Scott 등과의 대화를 읽었습니다. 여기에서 저를 인도했습니다. 여러분이 그것을 설명하기 위해 githib 프로젝트를 만들었습니다. – user1180316

+3

고마워. 이것은 정말로 나를 도왔다. Integrator 컨텍스트에서 JBoss로부터 데이터 소스를 얻으려면 다음을 사용하십시오 : DataSource dataSource = InitialContext.doLookup ("java : jboss/datasources/your-ds"); – homaxto

+0

'configuration','sessionFactoryImplementor' 또는'sessionFactoryServiceRegistry'에서 바로 이것을 할 수 있다면 정말 좋을 것입니다. 나는 주위를 찌르고 데이터 소스 또는 JNDI 이름을 찾을 수 없습니다. :(. – danieljimenez

1

CDI는 응용 프로그램이 시작/중지 될 때 실행되는 자체 수명주기를 정의합니다. (이것에 대해서는 이미 알고 있어야한다 : This은 기본 메커니즘을 배우기에 좋은 장소이다.) 문제는 - 최선의 지식으로는 Hibernate 초기화 프로세스가 CDI 시작에 직접 연결되어 있지 않다는 점이다. 이것은 Hibernate & CDI "events"사이의 관계에 의존하는 것이 안전한지 확신 할 수 없다는 것을 의미합니다. CDI-Event HibernateInitialized과 같은 것은 없습니다.

이렇게 말한 뒤에는 시도해 보겠습니다 :) BeforeBeanDiscovery에 연결하는 간단한 확장을 구현해야합니다.

This online presentation은 다양한 CDI 이벤트 및 해당 순서에 대한 개요를 제공합니다. 불행하게도 독일어로되어 있습니다.

+1

감사합니다. 이미 BeforeBeanDiscovery 이벤트가 Hibernate가 초기화 된 후에 발생한다는 것을 알아 냈습니다. 그래서 나는 Hibernate가 초기화되기 전에 (적어도 CDI가 아닌, 아마도 특정 AS가있는가?)에 연결하기가 불가능하다고 생각한다. –