Skip to content

21. Висновок

Ми розглянули основи фреймворку Struts 2 та представили додаток, що поєднує кілька технологій. Читачі початкового та середнього рівнів знайдуть у цьому документі матеріал для навчання та вдосконалення своїх знань. Залишається потреба у довіднику. Я знову раджу книгу:

«Struts 2 in Action», автори — Дональд Браун, Чад Майкл Девіс та Скотт Станлік, видавництво Manning.

На завершення я хотів би розповісти про проблеми, з якими я зіткнувся під час написання прикладів для цього документа. Я вже згадував про несподівану поведінку Struts 2, зокрема під час введення чисел і дат. Ось ще кілька проблем, з якими я зіткнувся:

Вивантажимо додаток [pam-01] із сервера Tomcat:

  

Консоль Apache відображає такі журнали:

1
2
3
4
5
6
7
8
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] виникло виключення

У більшості додатків, розроблених у цьому документі, трапляються саме ці дві помилки. Я не намагався вирішити цю нову проблему.