Skip to content

21. نتیجه‌گیری

ما اصول اولیه چارچوب Struts 2 را بررسی کرده و یک برنامه کاربردی ترکیبی از چندین فناوری را ارائه دادیم. خوانندگان مبتدی و سطح متوسط این سند را منبعی مفید برای یادگیری و توسعه مهارت‌های خود خواهند یافت. همچنان به یک کتاب مرجع نیاز است. من یک بار دیگر این کتاب را توصیه می‌کنم:

«Struts 2 in Action» نوشتهٔ دونالد براون، چد مایکل دیویس و اسکات استانلیک، منتشر شده توسط منینگ.

در پایان می‌خواهم با تشریح برخی از مشکلاتی که هنگام نوشتن مثال‌های این سند با آن‌ها مواجه شدم، به پایان برسانم. من قبلاً برخی از رفتارهای غیرمنتظره در Struts 2، به‌ویژه هنگام وارد کردن اعداد و تاریخ‌ها را برجسته کرده‌ام. در اینجا چند مشکل دیگر که با آن‌ها مواجه شدم آورده شده است:

بیایید برنامه [pam-01] را از سرور Tomcat خارج کنیم:

  

سپس کنسول آپاچی لاگ‌های زیر را نمایش می‌دهد:

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

در خطوط ۱۲، ۱۴ و ۱۶، خطاهای جدی گزارش شده‌اند. دو مورد از این خطاها به نشت حافظه احتمالی اشاره دارند. در واقع، برنامه [pam-02] با نشت حافظه مواجه است. پس از مدتی، برنامه غیرقابل استفاده می‌شود. در این صورت باید NetBeans را بست و برنامه را مجدداً راه‌اندازی کرد.

تمام خطاها به تِردها مربوط می‌شوند. خودِ اپلیکیشن [pam-02] از هیچ تِردی استفاده نمی‌کند. بنابراین باید فریم‌ورک‌های مورد استفاده، یعنی StrutsSpring 2.5 و Tiles را مظنون بدانیم. می‌توانیم با اطمینان Tiles را از فهرست خارج کنیم، زیرا احتمالاً با تِردها کار نمی‌کند. این ما را به Struts و Spring می‌رساند.

سپس تست دیگری را انجام می‌دهیم:

ما لایه [web] را به جای Struts 2 با استفاده از فریم‌ورک JSF پیاده‌سازی می‌کنیم. هیچ چیز دیگری تغییر نمی‌کند. سپس همان پیام‌های خطا را که با Struts 2 دریافت می‌کردیم، دریافت می‌کنیم.

بنابراین به نظر می‌رسد مقصر، Spring، استخر اتصال dbcp که در اینجا توسط Spring استفاده می‌شود، یا شاید هم خودم باشم اگر Spring را به درستی به کار نبرده‌ام. ممکن است یک تنظیم پیکربندی در Spring را که باعث پاک شدن نخ‌های ایجاد شده می‌شد نادیده گرفته باشم، ممکن است... بنابراین، راه‌حل این مشکل نشت حافظه هنوز باید پیدا شود.

آزمایش دیگر. نصب NetBeans با IDE شامل سرورهای Tomcat و GlassFish است. بیایید اجرای یک برنامه ایجادشده در این سند را روی GlassFish امتحان کنیم:

  • در [2] ویژگی‌های پروژه [exemple-08] و [1]
  • در [3]، انتخاب سرور وب

در اینجا صفحه‌ای که در مرورگر نمایش داده می‌شود:

قابلیت حمل مورد انتظار محقق نشده است. در اینجا دو خطا وجود دارد:

  • در [1]، بین‌المللی‌سازی کار نکرده است
  • در [2]، یک استثنا رخ داده است

برای اکثر برنامه‌های توسعه یافته در این سند، با همین دو خطای مشابه مواجه می‌شویم. من تلاشی برای حل این مشکل جدید نکرده‌ام.