21. Podsumowanie
Omówiono podstawy frameworka Struts 2 oraz zaprezentowano aplikację łączącą kilka technologii. Czytelnik na poziomie początkującym lub średniozaawansowanym znajdzie w tym dokumencie materiały do nauki i doskonalenia swoich umiejętności. Pozostaje jeszcze potrzeba posiadania podręcznika. Ponownie polecam książkę:
„Struts 2 in Action” autorstwa Donalda Browna, Chada Michaela Davisa i Scotta Stanlicka, wydanego przez wydawnictwo Manning.
Na zakończenie chciałbym przedstawić problemy, z którymi zetknąłem się podczas pisania przykładów zawartych w niniejszym dokumencie. Wspomniałem już o nieoczekiwanych zachowaniach Struts 2, zwłaszcza podczas wprowadzania liczb i dat. Oto kilka innych napotkanych problemów:
Wyładujmy aplikację [pam-01] z serwera Tomcat:
Konsola Apache wyświetla wówczas następujące logi:
| janv. 05, 2012 11:18:58 AM org.springframework.context.support.AbstractApplicationContext doClose
Infos: Closing org.springframework.web.context.support.XmlWebApplicationContext@57488b9c: display name [Root WebApplicationContext]; startup date [Thu Jan 05 11:18:45 CET 2012]; root of context hierarchy
janv. 05, 2012 11:18:58 AM org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons
Infos: Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@78ae9d8d: defining beans [config,metier]; root of factory hierarchy
janv. 05, 2012 11:18:58 AM org.apache.tiles.access.TilesAccess setContainer
Infos: Removing TilesContext for context: org.apache.catalina.core.ApplicationContextFacade
janv. 05, 2012 11:19:00 AM org.apache.catalina.startup.HostConfig checkResources
Infos: Repli (undeploy) de l'application web ayant pour chemin de contexte /pam-01
|
Wyładowanie przebiegło pomyślnie.
W ten sam sposób wyładujmy aplikację [pam-02]. W tym przypadku logi będą wyglądały następująco:
| janv. 05, 2012 11:21:07 AM org.springframework.context.support.AbstractApplicationContext doClose
Infos: Closing org.springframework.web.context.support.XmlWebApplicationContext@5d9131fa: display name [Root WebApplicationContext]; startup date [Thu Jan 05 11:11:10 CET 2012]; root of context hierarchy
janv. 05, 2012 11:21:07 AM org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons
Infos: Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@7b66d238: defining beans [config,metier,employeDao,indemniteDao,cotisationDao,entityManagerFactory,dataSource,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,txManager,org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0,org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor#0]; korzeń hierarchii fabrycznej
janv. 05, 2012 11:21:07 AM org.springframework.orm.jpa.AbstractEntityManagerFactoryBean destroy
Infos: Closing JPA EntityManagerFactory for persistence unit 'pam-PU'
janv. 05, 2012 11:21:07 AM org.hibernate.impl.SessionFactoryImpl close
Infos: closing
janv. 05, 2012 11:21:07 AM org.apache.tiles.access.TilesAccess setContainer
Infos: Removing TilesContext for context: org.apache.catalina.core.ApplicationContextFacade
janv. 05, 2012 11:21:07 AM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
Grave: The web application [/pam-02] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
janv. 05, 2012 11:21:07 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
Grave: The web application [/pam-02] appears to have started a thread named [Timer-0] but has failed to stop it. This is very likely to create a memory leak.
janv. 05, 2012 11:21:07 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
Grave: The web application [/pam-02] appears to have started a thread named [MySQL Statement Cancellation Timer] but has failed to stop it. This is very likely to create a memory leak.
janv. 05, 2012 11:21:08 AM org.apache.catalina.startup.HostConfig checkResources
Infos: Repli (undeploy) de l'application web ayant pour chemin de contexte /pam-02
|
W wierszach 12, 14 i 16 zgłaszane są poważne błędy. Dwa z nich wskazują na możliwość wystąpienia wycieku pamięci. Rzeczywiście, aplikacja [pam-02] wykazuje wycieki pamięci. Po pewnym czasie aplikacja przestaje działać. Należy wówczas zamknąć NetBeans i ponownie wdrożyć aplikację.
Wszystkie błędy dotyczą wątków. Aplikacja [pam-02] sama w sobie nie korzysta z wątków. Należy zatem podejrzewać wykorzystywane frameworki: Struts 2, Spring 2.5 oraz Tiles. Można z dużym prawdopodobieństwem wykluczyć Tiles, który prawdopodobnie nie obsługuje wątków. Pozostają Struts i Spring.
Przeprowadzamy zatem kolejny eksperyment:
Wdrażamy warstwę [web] z wykorzystaniem frameworka JSF zamiast Struts 2. Nic innego się nie zmienia. Otrzymujemy wówczas te same komunikaty o błędach, co w przypadku Struts 2.
Wydaje się więc, że winowajcą jest Spring, puli połączeń dbcp używanej tutaj przez Spring, albo ja sam, jeśli nie wykorzystałem Springa właściwie. Być może pominąłem konfigurację Springa, która pozwoliłaby na wyczyszczenie utworzonych wątków, być może... Rozwiązanie tego problemu wycieku pamięci pozostaje więc do znalezienia.
Kolejny eksperyment. IDE NetBeans instaluje się wraz z serwerami Tomcat i GlassFish. Spróbujmy uruchomić na GlassFish aplikację utworzoną w tym dokumencie:
- w [2] właściwości projektu [exemple-08] [1]
- w [3] – wybór serwera WWW
Oto strona wyświetlona w przeglądarce:
Oczekiwana przenośność nie została osiągnięta. Wystąpiły tutaj dwa błędy:
- w [1] nie zadziałała internacjonalizacja
- w [2] wystąpił wyjątek
W przypadku większości aplikacji opracowanych w niniejszym dokumencie występują te same dwa błędy. Nie próbowałem rozwiązać tego nowego problemu.