1. الخلفية
في مواقع الويب اليوم، هناك المزيد والمزيد من قنوات الوصول، وأصبحت التكنولوجيا أكثر تقدمًا، مثل WAP، وSMS، وEMAIL، والويب التقليدي، وSocket، وما إلى ذلك. حتى إذا تم تضمين قواعد البيانات وLDAP، فيمكن الوصول إذا لذلك، يجب أن تكون المساحة التي تحتاج إلى توسيع في التصميم جيدة جدًا لضمان أنه عند إضافة قنوات جديدة، لا يلزم إجراء المزيد من تعديلات الكود أو حتى تغييرات الكود. ولكن هل هذا ممكن، لا أعتقد أنه ممكن، ولكن هل هناك أي طريقة لحل الكمال في إطار الوصول متعدد القنوات هذا
؟
[الشكل 1]
كما هو موضح في الشكل 1، عندما يتم استخدام جميع عمليات الوصول الحالية، ينبهر المصممون إذا كان الأمر يتعلق بجمع الأشخاص، فيمكن كتابة هذه البرامج بأي طريقة، وستعمل بالتأكيد ولكن سيكون الحفاظ عليه أكثر إيلامًا، دعنا نعود إلى السؤال، كيف يمكننا تحقيق تنفيذ أكثر كمالا؟
[الشكل 2]
يبدو الشكل 2 وكأنه أخطبوط بثمانية مخالب، وترتبط أرجل الأخطبوط بجميع قنوات الوصول على التوالي. ويكمن دور جهاز التوجيه في ربط كل هذه القنوات التواصل مع جميع القنوات وتحقيق فوائد توجيه البيانات وتحسين قابلية التوسع والمرونة في بنية النظام ستكون كثيرة. يطلق عليه اسم XMLRouter لأنه إذا لم يتم استخدام XML، وهي لغة مرنة وموحدة، كوسيلة لنقل البيانات، فإن عبء عمل جهاز التوجيه سيزيد أيضًا بشكل كبير. سيؤدي تحديد مواصفات XML إلى التوسع المستقبلي ويأتي مع العديد من الفوائد.
3. الأفكار والأنماط
جاءت الفكرة الأصلية لـ XMLRouter من اللوحة الأم للكمبيوتر و<
>في Builder Pattern، تحدد فتحة PCI الخاصة باللوحة الأم للكمبيوتر مواصفات PCI طالما أن البطاقة التي تنتجها تتوافق مع معيار PCI، فيمكن أن تعمل عند إدخالها في اللوحة الأم يقترح Builder Pattern فصل البناء المعقد وتنفيذه خطوة بخطوة. يفصل XMLRouter هذه القنوات المعقدة وينفذها واحدة تلو الأخرى.
من أجل التواصل مع جهاز التوجيه، يجب تحديد واجهة موحدة عند الوصول القناة، تسمى هنا الخدمات، طالما أن البرنامج يتوافق مع مواصفات الخدمات، فيمكنه الوصول إلى بيانات جهاز التوجيه والتوجيه.
سيتم إنشاءوضع المصنع والوضع المركب
باستخدام وضع المصنع في جهاز التوجيه الذي تم إنتاجه بواسطة RouterFactory، سيتم وضعه في قائمة الانتظار عند استخدامه. يتم استدعاء جميع بيانات النقل وبيانات الاستقبال وبيانات الإرجاع من جهاز التوجيه المقابل من قائمة الانتظار، ويتم تطبيق الوضع المركب
4.ملف
تكوين XML
بالنسبة لجهاز التوجيه ينقسم الاستخدام إلى قسمين الأول هو تكوين جهاز التوجيه، مثل:
هنا اقتباس: <الخدمات> <اسم الخدمة = "قاعدة البيانات" نوع = "قاعدة البيانات" فئة = "com.web.service.DBService"> URL = "jdbc:مايكروسوفت: sqlserver://192.168.0.179:1433" المستخدم = "اختبار" passwd = "اختبار" /> الخدمة> <اسم الخدمة = "web" type = "web" class = "com.web.service.WebService"> <الموصل /> الخدمة> … |
هذا هو ملف التكوين الخاص بجهاز التوجيه. تمثل عقدة الخدمة القناة التي يجب الوصول إليها. تحتوي عقدة الخدمة على العقدة الفرعية للموصل قاعدة بيانات، فهي تحتوي على سمات مثل url، والمستخدم، وpasswd، والسائق، وما إلى ذلك، وإذا كانت عبارة عن مقبس، فإنها تحتوي على سمات مثل المنفذ وmaxthread. يمكن تكوين قيم السمات وفقًا للتعريف الخاص بك
نوع آخر من ملفاتXML
هو ملف بيانات معاملات XML، والذي يُستخدم لنقل البيانات في جميع الخدمات. تحتوي كل خدمة على ملف XML المقابل، مثل webtrans.xml، بالتنسيق التالي:
هنا اقتباس: <المعاملة> <اسم الخاصية = "إنشاء الوقت" نوع = "الطابع الزمني"/> <اسم الخاصية = "creatorid" type = "طويل"/> <اسم الخاصية = "doctypeid" نوع = "int"/> <اسم الخاصية = "docstatusid" نوع = "int"/> |
تنسيق dbtrans.xml المقابل هو كما يلي
هنا اقتباس: <اسم المفتاح الأساسي = "docid" /> <مجموعة> <اسم الخاصية = "إنشاء الوقت" نوع = "الطابع الزمني"/> <اسم الخاصية = "creatorid" type = "طويل"/> <اسم الخاصية = "doctypeid" نوع = "int"/> <اسم الخاصية = "docstatusid" نوع = "int"/> مجموعة> |
يمكن تخصيص بقية XML وفقًا لهذه القواعد
5. التنفيذ الفني
لـ RouterFactory
هنا اقتباس: الحزمة com.web.router؛ import com.web.platform.Exception.RouterException; import java.util.java/util/Hashtable.java.html" target="_blank">Hashtable؛ |
وفيما يلي جزء مرجعي: /** * الفئات التي تم إنشاؤها ومسحها بواسطة جهاز التوجيه */ RouterFactory للفئة العامة { /** * واجهة الشجرة مخزنة بواسطة جهاز التوجيه */ Private static java/util/Hashtable.java.html" target="_blank">Hashtable QueuePairFront = null; /** * شجرة الظهر المخزنة بواسطة جهاز التوجيه */ Private static java/util/Hashtable.java.html" target="_blank">Hashtable QueuePairBack = null; /** * الشجرة المخزنة بواسطة جهاز التوجيه */ Private static java/util/Hashtable.java.html" target="_blank">Hashtable QueueRouter = null; /** * تم إرجاع XMLRouter */ مثيل XMLRouter العام الثابت = فارغ؛ /** *تعريف الراوتر*/ RouterDefine العام الثابت routerdefine = null; /** * رقم معرف جهاز التوجيه */ مسار طويل ثابت عام = 0 ؛ /** * @ روزويد 3F169C21027C */ جهاز التوجيه العام () { } /** * تهيئة Hashtable وVector */ initFactory () الفراغ الثابت العام يلقي java/lang/Exception.java.html" target="_blank">استثناء { QueuePairFront = new java/util/Hashtable.java.html" target="_blank">Hashtable(); QueuePairBack = new java/util/Hashtable.java.html" target="_blank">Hashtable(); QueueRouter = new java/util/Hashtable.java.html" target="_blank">Hashtable(); initRouteDefine(); } /** * تهيئة إعدادات الطريق * */ الفراغ الثابت الخاص initRouteDefine() يلقي java/lang/Exception.java.html" target="_blank">استثناء { إذا (تعريف جهاز التوجيه == فارغ) routerdefine = new RouterDefine(); routerdefine.loadRouterDef(); } /** * إرجاع المثيل * @return com.web.router.XMLRouter */ يقوم getInstance (الفهرس الطويل) XMLRouter العام الثابت بطرح RouterException { return (XMLRouter)QueueRouter.get(new java/lang/Long.java.html" target="_blank">Long(index)); } /** * إنشاء مثيل لـ XMLRouter * @return com.web.router.XMLRouter * @روزويد 3F1618A103BC */ XMLRouter popInstance () العام الثابت يلقي RouterException { RouteIndex++; مثيل = جديد XMLRouter(routeIndex); setDefine(مثيل); QueueRouter.put(new java/lang/Long.java.html" target="_blank">Long(routeIndex)، مثيل); مثيل الإرجاع؛ } /** * مسح Hashtable وVector وما إلى ذلك. * @roseuid 3F1618B203C1 */ الفراغ الثابت الخاص freeResource() يلقي java/lang/Exception.java.html" target="_blank">استثناء { QueuePairFront.clear(); QueuePairBack.clear(); QueueRouter.clear(); QueuePairFront = QueuePairBack = QueueRouter = null; } /** * مسح المثيل * @param معرف المثيل * @throwsException */ إزالة الفراغ الثابت العام (مثيل XMLRouter) يلقي java/lang/Exception.java.html" target="_blank">استثناء { مثيل. واضح ()؛ QueueRouter.remove( new java/lang/Long.java.html" target="_blank">Long(instance.getIndex() ) ) ; } /** * الطريقة فارغة. * @return منطقية */ المنطق المنطقي العام الثابت هو Null() { … عودة كاذبة. } } |
هنا اقتباس: الحزمة com.web.router؛ import com.web.platform.Exception.RouterException; import com.web.common.*; import java.util.*; import java.lang.reflect.java/lang/reflect/Method.java.html" target="_blank">الطريقة؛ import java.lang.reflect.java/lang/reflect/Constructor.java.html" target="_blank">المُنشئ; /** * @المؤلف كيلي * @الإصدار 0.0.1 * مفتاح النظام الأساسي، وفئة التوجيه، التي سيقرأها كل جهاز توجيه من RouterFactory * الشجرة الأمامية والخلفية وRouteIndex المخزنة بواسطة جهاز التوجيه مخصصة لغرض التوجيه * يمكن مسح الكائنات المطبقة لاحقًا. * يمكن لجهاز التوجيه تنفيذ وظائف متزامنة وغير متزامنة. */ الفئة العامة XMLRouter { /** * واجهة الشجرة مخزنة بواسطة جهاز التوجيه */ Private static java/util/Hashtable.java.html" target="_blank">Hashtable QueuePairFront = null; /** * شجرة الظهر المخزنة بواسطة جهاز التوجيه */ Private static java/util/Hashtable.java.html" target="_blank">Hashtable QueuePairBack = null; /** * الرقم القياسي لهذا الراوتر */ مؤشر الطريق الطويل الخاص = 0؛ /** *إعدادات الراوتر*/ تحديد جهاز التوجيه الخاص = فارغ؛ /** * يستخدم لتحديد نقطة بداية المسار */ Private java/lang/String.java.html" target="_blank">String action = ""; /** * يُستخدم هذا المتغير فقط لتقديم طلب للحصول على فئة جديدة في طريقة الطريق إلى */ Private java/lang/String.java.html" target="_blank">String classname = ""; /** */ XMLRouter العام (فهرس طويل) { RouteIndex = Index; } /** * التوجيه * @throws استثناء * @روزويد 3F1616BD0186 */ توجيه الفراغ العام (Env env) يطرح RouterException، java/lang/Exception.java.html" target="_blank">استثناء { /*إذا كانت نقطة البداية*/ إذا (action.equalsIgnoreCase( RouterConstant.CFG_FUNC_ROUTETO ) ) { … } /*إذا كانت نقطة العودة*/ وإلا إذا (action.equalsIgnoreCase( RouterConstant.CFG_FUNC_ROUTEBACK ) ) { … } /*وإلا فهو خطأ*/ آخر throw new RouterException("تعيين خطأ في إجراء جهاز التوجيه."); } /** * اقرأ رقم معرف جهاز التوجيه هذا. * @العودة طويلة */ getIndex طويل عام () { مؤشر مسار العودة؛ } /** * مسح كافة الكائنات. * @throws RouterException */ الفراغ العام الواضح () يرمي RouterException { QueuePairFront.remove(new java/lang/Long.java.html" target="_blank">Long(routeIndex)); QueuePairBack.remove(new java/lang/Long.java.html" target="_blank">Long(routeIndex)); /*إعادة تدوير النظام*/ java/lang/System.java.html" target="_blank">System.runFinalization(); } /** * ضبط إعدادات جهاز التوجيه هذا. * @param ديف * @throws RouterException */ مجموعة الفراغ العام (RouterDefine def) تطرح RouterException { تعريف = تعريف؛ } /** * تعيين قيمة الإجراء * @param actionName * @throws RouterException */ مجموعة الفراغ العام (java/lang/String.java.html" target="_blank">String actionName) { الإجراء = اسم الإجراء؛ } } |
فئة الخدمة
هنا اقتباس: الحزمة com.web.common؛ import com.web.platform.Exception.RouterException; /** * فئة الخدمة الأصلية، مجردة */ فئة مجردة عامة RouteService { /** */ publicRouteService() { } /** * طريقة RouteTo هي نقطة البداية للمعاملة. * @param البيئة * @throws RouterException */ توجيه باطلة مجردة عامة إلى (Env env) يلقي RouterException؛ /** *routeBack، نقطة نهاية المعاملة، * @param البيئة * @throws RouterException */ توجيه باطلة مجردة عامة (Env env) يلقي RouterException؛ /** * طريقة قبول الطريق هي نقطة استلام المعاملة ووظيفة استلام الطريق إلى. * Routeaccept هي وظيفة المعالجة الرئيسية لكائنات المعاملات السلبية * @param env * @throws RouterException */ توجيه باطلة مجردة عامة (Env env) يطرح RouterException؛ /** * طريقة التوجيه هي وظيفة الواجهة الخارجية للخدمة *throws RouterException */ public Abstract void routing() throws RouterException; |
بعد ذلك، تحتاج إلى تنفيذ جميع فئات الخدمات، والتي لن يتم تقديمها هنا
6. اشرح أن
جهاز التوجيه هذا يمكنه تنفيذ المعاملات المتزامنة فقط حتى الآن، ولا يدعم المعاملات غير المتزامنة في الوقت الحالي. ومع ذلك، نظرًا لأن جهاز التوجيه مصمم باستخدام النموذج المركب، فيمكن أيضًا توسيع تنفيذ المعاملات غير المتزامنة، لذلك لن يتم إجراء تحليل مفصل هنا.