21. الخلاصة
لقد استكشفنا أساسيات إطار عمل Struts 2 وقدمنا تطبيقًا يجمع بين عدة تقنيات. سيجد القراء المبتدئون والمتوسطون في هذا المستند مواد تساعدهم على التعلم والتحسين. لا تزال هناك حاجة إلى كتاب مرجعي. وأوصي مرة أخرى بالكتاب:
"Struts 2 in Action" الذي ألفه دونالد براون وتشاد مايكل ديفيس وسكوت ستانليك، ونشرته دار مانينغ.
أود أن أختتم بتسليط الضوء على بعض المشكلات التي واجهتها أثناء كتابة الأمثلة في هذا المستند. لقد أشرت بالفعل إلى بعض السلوكيات غير المتوقعة لـ 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]; root of factory hierarchy
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.
ثم نجري تجربة أخرى:
نقوم بتنفيذ طبقة [الويب] باستخدام إطار عمل JSF بدلاً من Struts 2. ولا يتغير أي شيء آخر. ثم نحصل على نفس رسائل الخطأ التي ظهرت مع Struts 2.
لذا يبدو أن السبب هو Spring، أو مجموعة اتصالات dbcp التي يستخدمها Spring هنا، أو ربما أنا نفسي إذا لم أستخدم Spring بشكل صحيح. ربما نسيت إعدادًا في Spring من شأنه تنظيف الخيوط التي تم إنشاؤها؛ ربما... وبالتالي، لا يزال الحل لمشكلة تسرب الذاكرة هذه قيد البحث.
تجربة أخرى. يأتي NetBeans IDE مرفقًا بخادمي Tomcat و GlassFish. دعونا نجرب تشغيل تطبيق تم إنشاؤه في هذا المستند على GlassFish:
- في [2] خصائص مشروع [example-08] [1]
- في [3]، اختيار خادم الويب
إليك الصفحة التي تم استردادها في المتصفح:
لم يتم تحقيق قابلية النقل المتوقعة. هناك خطأان هنا:
- في [1]، لم تعمل ميزة التدويل
- في [2]، هناك استثناء
بالنسبة لمعظم التطبيقات التي تم تطويرها في هذا المستند، نواجه هذين الخطأين نفسهما. لم أحاول حل هذه المشكلة الجديدة.