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]; جذر التسلسل الهرمي للمصنع
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 وإعادة نشر التطبيق.
تشير جميع الأخطاء إلى الخيوط (threads). لا يستخدم التطبيق [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]، ظهرت استثناء
بالنسبة لمعظم التطبيقات التي تم تطويرها في هذا المستند، تظهر هاتان الخطأتان نفسهما. لم أحاول حل هذه المشكلة الجديدة.