2012-06-17 15 views
16

Próbowałem uruchomić drogę przelotu w moim wniosku przed hibernacji jest podpinania się na moim JBoss AS 7.1. Próbowałem z adnotacją @javax.ejb.Startup, ale jest to wykonywane po zainicjowaniu hibernacji i sprawdzeniu schematu bazy danych.CDI Rozszerzenie dla Flyway

Więc o ile rozumiem, możemy użyć CDI Extension który haczyki przed Hibernacja jest inicjowany. Czy jest jakieś wsparcie dla tego po wyjęciu z pudełka na przelot? A jeśli nie, czy ktoś wcześniej próbował to zrobić?

+0

nie sądzę istnieje J2EE standardowy wydarzenie, które się dzieje wystarczająco wcześnie na to. Będziesz musiał podłączyć się do interfejsów specyficznych dla kontenerów. Nie mam pojęcia, czy ktoś to zrobił dla Flywaya, przepraszam. Czy rozważałeś zrobienie tego jako części twojego wdrożenia lub uruchomienia skryptu zamiast uruchamiania aplikacji? –

+0

@TomAnderson Uważałem, aby wykonać działanie w locie w moim skrypcie wdrażania, muszę użyć do tego narzędzia wiersza poleceń. To nie wynika z dokumentacji, czy obsługuje Java Migracje, też tak myślę, że po prostu trzeba spróbować;) Jestem pewien, że istnieje sposób, aby to osiągnąć przy starcie aplikacji, ponieważ jest możliwe, z Liquibase (patrz https://github.com/aaronwalker/liquibase/commit/5be42a6779b2bef95e2d02d8703aceec91aedb59). Próbowałem czegoś podobnego, ale niestety to nie działa na mojej maszynie .... –

+1

@DominikObermaier Tak, linia poleceń Flyway obsługuje migracje Java. Mogą być wysyłane jako pliki jar w folderze/jar. –

Odpowiedz

28

Ok I w końcu okazało się, jak to zrobić: musiałem użyć Integracja API Hibernate. To jest cały kod musiałem napisać:

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 
    } 
} 

Jeśli ktoś jest zainteresowany więcej szczegółów, stworzyłem projekt GitHub, który wykaże, że: https://github.com/dobermai/Hibernate-Flyway-Integration

+1

Dziękujemy za opublikowanie rozwiązania Dominik. Przeczytałem twoją rozmowę ze Scottem itp. Na kanale IRC jboss i to doprowadziło mnie tutaj - wspaniale jest, że stworzyłeś projekt githib, żeby to zademonstrować. – user1180316

+3

Wielkie dzięki. To naprawdę mi pomogło. Aby uzyskać źródło danych z JBoss w kontekście integratora, użyj: DataSource dataSource = InitialContext.doLookup ("java: jboss/datasources/your-ds"); – homaxto

+0

Byłoby naprawdę świetnie, gdyby można to było zrobić bezpośrednio z 'konfiguracji',' sessionFactoryImplementor' lub 'sessionFactoryServiceRegistry'. Sprawdziłem i nie mogę znaleźć źródła danych lub jego nazwy JNDI. :(. – danieljimenez

1

CDI definiuje swój cykl życia, który jest wykonywany, gdy uruchamia aplikacje/przystanki. (Czy nie powinieneś już o tym wiedzieć: This jest dobrym miejscem do poznania podstawowego mechanizmu.)

Problem - według mojej najlepszej wiedzy - polega na tym, że proces inicjalizacji Hibernowania nie jest bezpośrednio powiązany z uruchomieniem CDI. Oznacza to, że nie jestem pewien, czy można bezpiecznie polegać na relacji między Hibernate & CDI "events". Z pewnością nie ma to jak CDI-Event HibernateInitialized.

Powiedziawszy to, spróbuję :) Powinieneś zaimplementować proste rozszerzenie, które łączy się z BeforeBeanDiscovery, które jest tak wczesne, jak to tylko możliwe.

This online presentation daje pogląd na temat różnych wydarzeń CDI i ich kolejności. Jest w języku niemieckim, niestety.

+1

Dzięki, już zorientowałem się, że zdarzenie BeforeBeanDiscovery jest zgłaszane po zainicjowaniu Hibernacji. Sądzę więc, że nie można się podłączyć zanim Hibernate zostanie zainicjalizowany (przynajmniej nie z CDI, może jest coś specyficznego?). –