Przykład booking traktowany jest przez programistów Seama jako aplikacja referencyjna wykorzystująca wiele z funkcjonalności Seama oraz Korporacyjnej Javy 5, która prezentuje również możliwość uruchomienia Seama na Glassfish czy OC4J. Aplikacja jest de facto gwarantem, że Seam to szkielet programistyczny niezależny od środowiska uruchomieniowego, a co za tym idzie i JBoss AS, byle było to środowisko serwera aplikacji Java EE 5 (i tu też nie do końca, ale to już nie ma większego znaczenia). Brakowało jedynie uruchomić Seama na Geronimo i lista zrobiłaby się całkiem ciekawa. Teraz już taka jest.

Kiedy kilka dni temu jakimś dziwnym trafem zacząłem próbować się z Seamem i Geronimo nie przypuszczałem, że zajmie mi to prawie tydzień. Postanowiłem uruchomić Seama na Geronimo, aby połączyć przyjemne z pożytecznym, tj. podszkolić się z JSF 1.2 (wraz z dodatkowymi projektami jak facelets i RichFaces) oraz kontynuować potyczki z EJB3 i już myślałem, że będzie konieczna niezła modyfikacja trójki Geronimo/OpenEJB/OpenJPA, kiedy okazało się, że wystarczyło jedynie odpowiednie skonfigurowanie aplikacji dla Geronimo i voila - zaczęło działać. Bardzo ważny podkreślenia jest fakt, że nie zmodyfikowałem żadnego elementu przykładu booking, a wszelkie możliwe modyfikacje umieściłem w planie (plik wspomagający rozmieszczenie aplikacji na serwerze Geronimo), co jedynie przesłania domyślną konfigurację aplikacji. Dla zwrócenia uwagi napiszę, że uruchomienie przykładu na Glassfish, czy OC4J wymaga zmiany w persistence.xml i przebudowania aplikacji. Geronimo pozostawia przykład nietknięty.
Dodatkową ciekawostką jest uruchomienie przykładu z domyślnym dostawcą JPA w Geronimo - Apache OpenJPA, ale również z Hibernate JPA. Jak się okazało Hibernate również nie jest konieczny dla Seama, co wskazuje na siłę Seama jako szkieletu programistycznego niezależnego od docelowej platformy uruchomieniowej byle dostarczone były pewne usługi, z których korzysta dostarczane przez EJB3, JPA, JSF, itp.
Aby nie pozostawić tego tematu bez dodatkowego komentarza dopiszę, że aby uruchomić przykład booking z Hibernate JPA musiałem uruchomić go w trybie debugowania (ech, kiedy będzie przyjemniejsze słówko dla tego?!) i "przeskoczyć" jedną linię w org.hibernate.ejb.Ejb3Configuration po pobraniu źródeł Hibernate EntityManagera. Po zamianie wartości wywołania info.getJarFileUrls() na linii 344 na Collections.EMPTY_LIST Hibernate działał dalej bezbłędnie. Ot, takie malutkie usprawnienie. Sprawdziłem dokumentację javadoc dla javax.persistence.spi.PersistenceUnitInfo i trudno zdecydować, czy pusta lista (oczekiwanie Hibernate JPA) jest bardziej poprawna od null (zwracanego prze Geronimo) jako wynik metody getJarFileUrls().
Zamierzam spisać moje doświadczenia w artykule i opublikować na swoim Wiki. Rozejrzę się również za możliwością opublikowania go w Software Developer's Journal (jakby tak otworzyć nowy rok takim artykułem byłoby ciekawie). Teraz można spodziewać się więcej Seama u mnie ;-)
Co ciekawsze wycinki z dziennika (zdarzeń) Geronimo 2.1-SNAPSHOT, po poprawnym rozmieszczeniu aplikacji booking Seama.
02:10:11,812 DEBUG [GBeanSingleReference] Started org.jboss.seam.examples.jee5/jboss-seam-jee5/2.0.0.GA/ear?
J2EEApplication=org.jboss.seam.examples.jee5/jboss-seam-jee5/2.0.0.GA/ear,JCAConnectionFactory=jdbc/__default,
JCAResource=seam-jee5-dbpool,ResourceAdapter=seam-jee5-dbpool,ResourceAdapterModule=seam-jee5-dbpool,
j2eeType=JCAManagedConnectionFactory,name=jdbc/__default
02:10:11,828 DEBUG [GBeanInstanceState] GBeanInstanceState for: org.jboss.seam.examples.jee5/jboss-seam-jee5/2.0.0.GA/ear?
J2EEApplication=org.jboss.seam.examples.jee5/jboss-seam-jee5/2.0.0.GA/ear,JCAConnectionFactory=jdbc/__default,
JCAResource=seam-jee5-dbpool,ResourceAdapter=seam-jee5-dbpool,ResourceAdapterModule=seam-jee5-dbpool,
j2eeType=JCAManagedConnectionFactory,name=jdbc/__default State changed from starting to running
02:10:11,890 DEBUG [GBeanSingleReference] Started org.jboss.seam.examples.jee5/jboss-seam-jee5/2.0.0.GA/ear?
EJBModule=jboss-seam-jee5.jar,J2EEApplication=org.jboss.seam.examples.jee5/jboss-seam-jee5/2.0.0.GA/ear,
PersistenceUnitModule=jboss-seam-jee5.jar,j2eeType=PersistenceUnit,name=bookingDatabase
02:10:12,187 INFO [Version] Hibernate Annotations 3.3.0.GA
02:10:12,296 INFO [Environment] Hibernate 3.2.4.sp1
02:10:12,390 INFO [Environment] hibernate.properties not found
02:10:12,406 INFO [Environment] Bytecode provider name : cglib
02:10:12,421 INFO [Environment] using JDK 1.4 java.sql.Timestamp handling
02:10:13,156 INFO [Version] Hibernate EntityManager 3.3.1.GA
02:10:13,546 INFO [Ejb3Configuration] Processing PersistenceUnitInfo [
name: bookingDatabase
...]
02:16:13,328 ERROR [Ejb3Configuration] Container is providing a null PersistenceUnitRootUrl: discovery impossible
02:16:13,468 WARN [Ejb3Configuration] Defining hibernate.transaction.flush_before_completion=true ignored in HEM
....
02:16:18,609 INFO [EntityBinder] Bind entity org.jboss.seam.example.booking.User on table Customer
02:16:19,250 INFO [Version] Hibernate Validator 3.0.0.GA
02:16:19,812 INFO [ConnectionProviderFactory] Initializing connection provider:
org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider
02:16:19,828 INFO [InjectedDataSourceConnectionProvider] Using provided datasource
02:16:19,843 INFO [SettingsFactory] RDBMS: Apache Derby, version: 10.3.1.4 - (561794)
02:16:19,843 INFO [SettingsFactory] JDBC driver: Apache Derby Embedded JDBC Driver, version: 10.3.1.4 - (561794)
02:16:20,093 INFO [Dialect] Using dialect: org.hibernate.dialect.DerbyDialect
02:16:20,156 INFO [TransactionFactoryFactory] Transaction strategy: org.hibernate.ejb.transaction.JoinableCMTTransactionFactory
02:16:20,171 INFO [TransactionManagerLookupFactory] instantiating TransactionManagerLookup:
org.apache.geronimo.hibernate.transaction.GeronimoTransactionManagerLookup
02:16:20,187 INFO [TransactionManagerLookupFactory] instantiated TransactionManagerLookup
....
02:16:28,625 INFO [ServletContextListener] Welcome to Seam 2.0.0.GA
...
Wiesz Jacek do dla mnie byłoby świetne? Uruchomić Seam'a bez EJB - tj. wyekstrachować z tego tylko "lepsze JSF" - w szczególności możliwość łatwego generowania URL'i.
OdpowiedzUsuńDziałanie Seama opiera się na fundamentalnej cesze JSF - łatwej rozbudowy. Seam dodaje w faces-config.xml swoje NavigationHandler, Resolvery itp. i w ten sposób z JSF robi Seama (dodając do tego EJB3, ale mając własny resolver możesz już wszystko - podobnie ze spring). Wydaje mi się, że Seama uruchamia się bez EJB3, bo właśnie możliwe jest uruchomienie jsf bez ejb3 i w ogóle bez całej maszynerii javaee5.
OdpowiedzUsuńMożesz napisać coś o tym łatwiejszym generowani urli? Nadal nie rozwiązałem Twojego wcześniejszego pomysłu odnośnie google i urli w jsf, więc z Twoją pomocą się uda.
Witaj,
OdpowiedzUsuńA jak rozwiązałeś problem z "duplicate class definition"?
I, czy mógłbyś podać jakie zmiany dałeś w planie?
Dzięki!
Pozdrawiam,
Piotr
(Prawie) wszystko jest już na dev@geronimo. Spisuję kroki w postaci dokumentacji na stronach Geronimo. Jeszcze (dłuższą) chwilkę ;-)
OdpowiedzUsuńhej Jacek!
OdpowiedzUsuńsuper robota!
nie moge sie doczekac, kiedy bede mogl odpalic JBoss Seam na moim ulubionym serwerze aplikacji!
A gdzie na stronach Geronimo będzie można znaleźć artykuł?
OdpowiedzUsuńPozdrawiam
Ech, co za niecierpliwy gość ;-) Momento, właśnie się pisze, a list jest na dev@geronimo. Na pewno się dowiesz, kiedy opublikuję artykuł. Nie mógłbym odmówić sobie przyjemności skorzystania z Twojej oceny po zakończeniu.
OdpowiedzUsuń