21. Висновок
Ми розглянули основи фреймворку Struts 2 та представили додаток, що поєднує кілька технологій. Читачі початкового та середнього рівнів знайдуть у цьому документі матеріал для навчання та вдосконалення своїх знань. Залишається потреба у довіднику. Я знову раджу книгу:
«Struts 2 in Action», автори — Дональд Браун, Чад Майкл Девіс та Скотт Станлік, видавництво Manning.
На завершення я хотів би розповісти про проблеми, з якими я зіткнувся під час написання прикладів для цього документа. Я вже згадував про несподівану поведінку Struts 2, зокрема під час введення чисел і дат. Ось ще кілька проблем, з якими я зіткнувся:
Вивантажимо додаток [pam-01] із сервера Tomcat:
Консоль Apache відображає такі журнали:
| 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
|
Вивантаження пройшло успішно.
Вивантажимо таким самим чином [pam-02]. Журнали матимуть такий вигляд:
| 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]; корінь заводської ієрархії
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
|
У рядках 12, 14, 16 повідомляється про серйозні помилки. Дві з них вказують на можливий витік пам'яті. Дійсно, у додатку [pam-02] спостерігаються витоки пам'яті. Через деякий час додаток стає непридатним для використання. Тоді доводиться закрити NetBeans і перерозгорнути додаток.
Усі помилки пов’язані з потоками. Сама програма [pam-02] їх не використовує. Тому слід підозрювати використовувані фреймворки: Struts 2, Spring 2.5, Tiles. Можна обґрунтовано виключити Tiles, оскільки він, ймовірно, не підтримує потоки. Залишаються Struts і Spring.
Тоді проводимо ще один експеримент:
Ми реалізуємо рівень [web] із використанням фреймворку JSF замість Struts 2. Все інше залишається без змін. У результаті ми отримуємо ті самі повідомлення про помилки, що й у випадку зі Struts 2.
Отже, винуватцем, схоже, є Spring, пул з’єднань dbcp, який тут використовує Spring, або ж я сам, якщо неправильно застосував Spring. Можливо, я забув про налаштування Spring, яке дозволило б очистити створені потоки, можливо, я... Тож рішення цієї проблеми витоку пам’яті ще належить знайти.
Інший експеримент. IDE NetBeans встановлюється разом із серверами Tomcat і GlassFish. Спробуємо запустити на GlassFish додаток, створений у цьому документі:
- у [2] властивості проєкту [exemple-08] [1]
- у [3] — вибір веб-сервера
Ось сторінка, яка відображається у браузері:
Очікувана сумісність не досягнута. Тут є дві помилки:
- у [1] не спрацювала інтернаціоналізація
- у [2] виникло виключення
У більшості додатків, розроблених у цьому документі, трапляються саме ці дві помилки. Я не намагався вирішити цю нову проблему.