जैसा कि
दूसरे भाग में वादा किया गया है
, यह लेख विशेष रूप से व्यावहारिक उदाहरणों के लिए समर्पित है जो कैशे + जावा + फ्लेक्स की बातचीत की विशेषताओं को प्रदर्शित करता है। चलो झुंड में डेटा प्रकार परिवर्तित करके शुरू करते हैं। हमने डेटा प्रकारों जैसे कि इंटीजर, फ्लोट, स्ट्रिंग, बुलियन के रूपांतरणों पर ध्यान केंद्रित नहीं किया, क्योंकि ये प्रकार कैची और जावा में समान हैं (और एक्शनस्क्रिप्ट में सभी संख्यात्मक प्रकार संख्या में परिवर्तित हो गए हैं)। एक और चीज वस्तुओं का संग्रह है। उनका परिवर्तन बहुत ही अविवेकपूर्ण है, इसलिए हम उन पर अधिक विस्तार से ध्यान दें।
संग्रह परिवर्तित करें
"
आइए हम किसी विशेष चक्र में विषयों की सूची के उदाहरण का उपयोग करके पूरे कैशे + जावा + फ्लेक्स बंडल में संग्रह के परिवर्तनों की जांच करें। एक संग्रह के एक उदाहरण के रूप में, रिश्तों पर विचार करें - कैशे वर्गों के बीच एक प्रकार का संबंध, जो रिश्ते प्रकार के गुणों के रूप में कार्यान्वित किया जाता है, एक विशिष्ट प्रकार की अखंडता समर्थन के साथ।
कैच पर रिश्तों के बारे में अधिक जानें ।
Class IKIT.cCicl Extends %Persistent { … Relationship ListOfDisc As IKIT.cDiscipline [Cardinality = many, Inverse = Cicl]; … }
उत्पन्न जावा प्रक्षेपण (जावा सी-क्लासेस पैकेज) में, इस संपत्ति का प्रतिनिधित्व com.intersys.classes की एक वस्तु द्वारा किया जाता है।
public com.intersys.classes.RelationshipObject getListOfDisc() throws com.intersys.objects.CacheException { com.intersys.cache.Dataholder dh = mInternal.getProperty("ListOfDisc", true); com.intersys.cache.CacheObject cobj = dh.getCacheObject(); if (cobj == null) return null; return (com.intersys.classes.RelationshipObject)(cobj.newJavaInstance()); }
इस वर्ग के पास एक मानक असिस्ट विधि है, जो एक रिलेशनशिप ऑबजेक्ट लेता है और एक सूची देता है, जो भविष्य में सूची के साथ काम करने की सुविधा प्रदान करता है।
एम-क्लास सूची (सूची सूचीऑफडिस्क) का उपयोग करते हैं, इसलिए आपको प्रत्येक सी-क्लास ऑब्जेक्ट को रिलेशनशिपऑब्जेक्ट से संबंधित एम-क्लास ऑब्जेक्ट में बदलने की आवश्यकता है। यह क्रिया CacheTransform वर्ग में होती है।
for (int i=0;i<cur.getListOfDisc().size();i++) { res.getListOfDisc(). add(TranformDi((cDiscipline)cur.getListOfDisc().asList().get(i))); }
अगले, m- वर्ग ग्रेनाइट मॉड्यूल के लिए POM फ़ाइल में निर्दिष्ट मापदंडों के अनुसार फ्लेक्स मॉड्यूल में अनुमानित हैं। डिफ़ॉल्ट रूप से ग्रेनाइट्स एक सूची प्रकार प्रक्षेपण (जावा में) के लिए ListCollectionView प्रकार (एक्शनस्क्रिप्ट में) का उपयोग करता है। उदाहरण के लिए, उत्पन्न mCiclBase AS वर्ग में एक सूची का प्रक्षेपण इस तरह दिखेगा।
[Bindable] public class mCiclBase implements IExternalizable { … protected var _listOfDisc:ListCollectionView; … public function set listOfDisc (value: ListCollectionView):void { _listOfDisc = value; } public function get listOfDisc():ListCollectionView { return _listOfDisc; } … }
एक्शनस्क्रिप्ट में सीधे काम को और सरल बनाने के लिए, हमने ArrayCollection क्लास का उपयोग किया, जो ListCollectionView वंशज वर्ग है और मानक Ilist फ्लेक्स इंटरफ़ेस (cur.listOfDisc = new ArcCollection) ();
उलटा रूपांतर उसी पैटर्न का अनुसरण करता है। ग्रेनाइट के माध्यम से एएस प्रोजेक्शन में होने वाले परिवर्तन भी जावा एम-क्लास पैकेज की संबंधित कक्षाओं में किए जाते हैं। जावा m- से जावा c- कक्षाओं में संग्रह वस्तुओं का रूपांतरण रेवस उपसर्ग के साथ कार्य में CacheTransform वर्ग में होता है। हमारे मामले में, RevTranformCi फ़ंक्शन (mCicl cur, Integer act) में, जो एक एम-क्लास ऑब्जेक्ट और एक एक्शन (ओवरराइट या क्रिएट) लेता है, डेटाबेस को ऑब्जेक्ट लिखता है और सी-क्लास ऑब्जेक्ट लौटाता है। इस फ़ंक्शन में शीट रूपांतरण इस प्रकार होता है।
for (int i=0;i<cur.getListOfDisc().size();i++) { if(cur.getListOfDisc().get(i).getId()!=null) { res.getListOfDisc().add(RevTranformDi(cur.getListOfDisc().get(i),1)); } if(cur.getListOfDisc().get(i).getId()==null) { res.getListOfDisc().add(RevTranformDi(cur.getListOfDisc().get(i),2)); } }
उसके बाद, मानक _save विधि को c-classes ऑब्जेक्ट पर कॉल किया जाता है, जो Caché डेटाबेस में डेटा को संग्रहीत करता है, और Caché com.intersys.classes.Relationship.bject में लिस्ट टाइप को संबंधित प्रकार पर टाइप करता है।
अब जब सब कुछ संग्रह के साथ स्पष्ट है, तो एक उदाहरण पर चलते हैं जो वस्तुओं को जोड़ने और हटाने का प्रदर्शन करता है।
किसी वस्तु को जोड़ने और हटाने का उदाहरण
पाठ्यक्रम को जोड़ने और हटाने के उदाहरण का उपयोग करके एक सेवा इंटरफ़ेस के साथ काम करने पर विचार करें। "पाठ्यक्रम" ऑब्जेक्ट mCurriculum वर्ग के AS प्रोजेक्शन में पहली बार बनाया गया है। इस ऑब्जेक्ट का निर्माण क्लाइंट पक्ष पर किया जाता है, फिर इसे सर्वर पर स्थानांतरित किया जाता है और डेटाबेस में संग्रहीत किया जाता है। ऐसा करने के लिए, हम addOneCurr पद्धति को कॉल करते हैं जो ऑब्जेक्ट के माध्यम से सर्वर सेवाओं के इंटरफ़ेस को लागू करता है।
userService.addOneCurr(cur, k);
जहां कर्व फ्लेक्स में निर्मित mCurriculum प्रोजेक्शन क्लास की वस्तु है, और k क्रिया को चुनने के लिए जिम्मेदार चर है (जोड़ें या संपादित करें)।
यहां यह याद रखना चाहिए कि ग्रेनाइट्स एसिंक्रोनस रूप से अनुरोध भेजता है और, यदि फ़ंक्शन के पूरा होने के बाद किसी भी कार्रवाई को सख्ती से करने के लिए आवश्यक है, तो इसे सीधे परिणाम हैंडलर फ़ंक्शन में रखा जाना चाहिए। उदाहरण के लिए: userService.addOneCurr ( cur, k, function(e:TideResultEvent):void { Alert.show(" "); updateOneCur(curCurriculum.id); }, function (e:TideFaultEvent):void { Alert.show(e.fault.faultDetail); } );
यह फ़ंक्शन AddOneCurr फ़ंक्शन को सफलतापूर्वक पूरा करने के बाद "पूर्ण रूप से जोड़ें" संदेश को सख्ती से प्रदर्शित करेगा।नीचे ग्रेनाइट द्वारा उत्पन्न IUserService इंटरफ़ेस के एक्शनस्क्रिप्ट प्रोजेक्शन क्लास में addOneCurr फ़ंक्शन के लिए कोड है।
public function addOneCurr(arg0:mCurriculum, arg1:Number, resultHandler:Object = null, faultHandler:Function = null):void { if (faultHandler != null) callProperty("addOneCurr", arg0, arg1, resultHandler, faultHandler); else if (resultHandler is Function || resultHandler is ITideResponder) callProperty("addOneCurr", arg0, arg1, resultHandler); else if (resultHandler == null) callProperty("addOneCurr", arg0, arg1); else throw new Error("Illegal argument to remote call (last argument should be Function or ITideResponder): " + resultHandler); }
स्रोत जावा वर्ग UserService में एक ही फ़ंक्शन, जो IUserService इंटरफ़ेस को लागू करता है।
@Override public Boolean addOneCurr(mCurriculum cur,Integer k){ objT.RevTranformCu(cur,k); return true; }
यह फ़ंक्शन CacheTransform वर्ग के RevTranformCu (mCurriculum cur, Integer act) विधि को कहता है, जिसे वर्ग mCurriculum की एक वस्तु को वर्ग cCurriculum की एक वस्तु में बदलने और डेटाबेस में लिखने के लिए डिज़ाइन किया गया है। इसके अलावा, addOneCurr फ़ंक्शन "कैस्केड्स" को संसाधित किए जा रहे पाठ्यक्रम के संग्रह में शामिल वस्तुओं की बचत का कारण बनता है।
जैसा कि आप उदाहरण से देख सकते हैं, विधि क्रमिक रूप से सभी वस्तुओं को सेमेस्टर, साइकिल की सूची से बचाती है, और इसी तरीकों का उपयोग करके लॉग करती है RevTranformSe, RevTranformCi, RevTranformLo। सिद्धांत समान रहता है: यदि आईडी अनुपस्थित है, तो एक नई वस्तु बनाई जाती है, अन्यथा मौजूदा एक को संपादित किया जाता है।
इसी तरह, पाठ्यक्रम को हटाने से आय होती है। इसे हटाने के लिए, बस mCurriculum प्रोजेक्शन क्लास ऑब्जेक्ट की आईडी प्राप्त करें और इसे सर्वर पर स्थानांतरित करें। IUserService इंटरफ़ेस फ़ंक्शन के AS प्रक्षेपण में delOneCurr फ़ंक्शन इसके लिए जिम्मेदार है।
userService.delOneCurr ( curId, function (e:TideResultEvent):void { loadCur(0); }, function (e:TideFaultEvent):void { Alert.show(e.fault.faultDetail); } );
स्रोत जावा वर्ग UserService में एक ही फ़ंक्शन, जो IUserService इंटरफ़ेस को लागू करता है।
@Override public void delOneCurr(Integer i) { objT.deleteOneCurr(i); }
DelOneCurr फ़ंक्शन, CacheTransform वर्ग के deleteOneCurr (Integer dd) विधि को कॉल करता है, जिसे डेटाबेस से cCurriculum वर्ग की वस्तु को हटाने के लिए डिज़ाइन किया गया है। इसके अलावा, यह फ़ंक्शन हटाए गए पाठ्यक्रम की चादरों में शामिल वस्तुओं को हटाने का संकेत देता है।
विधि DeleteOneCurr। public void deleteOneCurr(Integer dd) { try { System.out.println("//MAS: TRY DELETE Curriculum"); cCurriculum cur; cur=(cCurriculum) cCurriculum._open(dbconnection, new Id(dd)); if(cur.getListOfCicl()!=null){ for(int i=0;i<cur.getListOfCicl().size();i++) { cCicl k=(cCicl)cur.getListOfCicl().asList().get(i); deleteOneCicl(Integer.parseInt(k.getId().toString())); } } if(cur.getListOfSemestr()!=null) { for(int i=0;i<cur.getListOfSemestr().size();i++) { cSemestr k = (cSemestr)cur.getListOfSemestr().asList().get(i); deleteOneSeme(Integer.parseInt(k.getId().toString())); } } if(cur.getListOfLogs()!=null) { for(int i=0;i<cur.getListOfLogs().size();i++) { cLogs k=(cLogs)cur.getListOfLogs().asList().get(i); deleteOneLog(Integer.parseInt(k.getId().toString())); } } cur._close(); cCurriculum._deleteId(dbconnection, new Id(dd)); System.out.println("//MAS: DELETE Complite"); } catch (CacheException e) { e.printStackTrace(); } }
जैसा कि आप उदाहरण से देख सकते हैं, विधि क्रमिक रूप से सभी ऑब्जेक्ट्स को सेमेस्टर, साइकल की सूची से हटा देती है, और इसी तरीकों को हटाकर लॉग इन करती हैं DeleteOneSeme, deleteOneCicl, deleteOneLog।
"उत्पादन" के बारे में कुछ शब्द
चूंकि कैश अनुमान ओओपी के सिद्धांतों का पूरी तरह से समर्थन करते हैं, एक क्षेत्र को जोड़ना या कैश क्लास में एक प्रकार को बदलना सीधे जावा में संबंधित ऑपरेशन के बराबर है।
अधिक विशेष रूप से, अनुमानों का उपयोग और कक्षाओं के दोहराव से परियोजना में बदलाव करते समय या कैशे में डेटा प्रकार बदलते समय परियोजना में बदलाव करना अपेक्षाकृत आसान हो जाता है।
इस तरह के एक समाधान को बनाए रखना आसान है, मुख्य आवश्यकता जिसे पूरा किया जाना चाहिए, नामकरण का निरीक्षण करते समय वर्गों, गुणों और विधियों का नामकरण।
कक्षाओं की संख्या में वृद्धि के साथ, कोड प्रत्यक्ष अनुपात में बढ़ता है, और यदि आप ट्रानफॉर्म के कार्यों को एकजुट करने का प्रयास करते हैं, तो यह कई गुना छोटा है।
इस स्तर पर, परिवर्तन करते समय या एक नया वर्ग जोड़ते समय, आपको यह करना होगा:
- प्रक्षेपण कक्षाओं को पुन: उत्पन्न करना और मौजूदा लोगों को बदलना (या नए जोड़ना);
- एम-कक्षाओं में उचित परिवर्तन करें (चूंकि ओओपी के सिद्धांतों को लागू किया जाता है, ऐसे परिवर्तन मुश्किल नहीं होंगे);
- नियंत्रक में बदलाव करें (एकीकरण से बचा जा सकता है)।
निष्कर्ष
प्रस्तुत संयोजन और प्रस्तावित दृष्टिकोण के सभी पेशेवरों और विपक्षों को ध्यान में रखते हुए, यह एजेंट प्रौद्योगिकियों के प्रति प्रणाली के आगे के विकास पर विचार करने योग्य है।
चूंकि
JADE को मंच के रूप में चुना गया था, इसलिए यह स्वाभाविक है कि यह पूरे सिस्टम के आर्किटेक्चर के डिजाइन पर कई प्रतिबंध लगाता है। चूँकि JADE स्वयं जावा में लिखा गया है और एक वर्चुअल मशीन के तहत काम करने वाला एक क्रॉस-प्लेटफ़ॉर्म सिस्टम है, इसलिए इस वातावरण में विकसित MAC का तर्क भी बनाया गया है। JADE की मुख्य इकाई (तत्व) एक एजेंट है, जो संक्षेप में, एक जावा वर्ग का एक उद्देश्य है। इस एजेंट के कामकाज का पूरा तर्क भी इस वर्ग में लागू किया गया है। ऑब्जेक्ट-ओरिएंटेड डेटाबेस में प्रत्येक एजेंट के दीर्घकालिक डेटा भंडारण को लागू करना सुविधाजनक है, जैसा कि एजेंट अपने आप में एक बौद्धिक घटक की उपस्थिति मानता है, जो अर्थ नेटवर्क और ऑन्थोलॉजी पर आधारित हो सकता है। ओटिटोलॉजी, बदले में, संग्रहीत डेटा और विरासत (इसलिए बोलने के लिए) एक वस्तु-उन्मुख दृष्टिकोण है। इस प्रकार, इस प्रणाली को लागू करने के लिए सबसे सुविधाजनक डेटाबेस प्रबंधन प्रणाली ऑब्जेक्ट-ओरिएंटेड है और जावा कक्षाओं के माध्यम से इसके साथ काम करने की क्षमता प्रदान करती है। Caché DBMS, हमारी राय में, इस कार्य के लिए एक अच्छा उम्मीदवार है।
इस स्तर पर, फ्लेक्स तकनीक को वेब-इंटरफ़ेस के रूप में उपयोग करने की प्रभावशीलता का मूल्यांकन करना मुश्किल है, क्योंकि कैच-जावा बंडल आगे के विकास के लिए एक विस्तृत पर्याप्त विकल्प प्रदान करता है।
प्रस्तावित वास्तुकला के नुकसान में जावा एम-क्लास पैकेज में जावा अनुमानों का दोहराव और कैशेट्रांसफॉर्म क्लास में अतिरिक्त कार्यों के कार्यान्वयन शामिल हैं, जो जावा प्रक्षेपण और एम-क्लास क्लास ऑब्जेक्ट के सिंक्रनाइज़ेशन को सुनिश्चित करते हैं। भविष्य में, काचे में जावा अनुमानों को उत्पन्न करने के लिए तंत्र को अंतिम रूप देकर इस समस्या को हल किया जा सकता है, जो जावा अनुमानों द्वारा उपयोग किए गए बाहरी अनुप्रयोगों द्वारा निर्धारित अतिरिक्त विशिष्टता को ध्यान में रखने में सक्षम होगा। उदाहरण के लिए, प्रक्षेपण पीढ़ी के लिए अतिरिक्त आवश्यकताओं को एक अलग xml फ़ाइल में वर्णित किया जा सकता है, जिसके उपयोग से पीढ़ी तंत्र सही जावा अनुमानों का निर्माण करेगा। फिर जावा अनुमानों की डुप्लिकेट कक्षाओं की आवश्यकता गायब हो जाएगी।
लेखकों से
हमें उम्मीद है कि आप इस लेख को पढ़ने में रुचि रखते थे, और आप अपने लिए कुछ उपयोगी पा सकते थे। बेशक, हम परियोजना पर काम करना जारी रखेंगे (इसके अनुकूलन पर काम भी शामिल है), इसलिए भविष्य में यह संभव है कि लेखों की इस श्रृंखला का विस्तार होगा।
अब हमने विकास के तहत मल्टी-एजेंट सिस्टम के केवल एक मॉड्यूल पर विचार किया है, और हमारा मुख्य लक्ष्य काचे + जावा + फ्लेक्स बंडल के साथ पाठक को परिचित करना था। उसी समय, हमने एजेंटों का उपयोग करने के मुद्दे को अनसुलझा छोड़ दिया। इसलिए, जो इस विषय में रुचि रखते हैं, उनके लिए हम सुझाव देते हैं कि आप अपने आप को स्पॉइलर के तहत कुछ स्पष्टीकरण के साथ परिचित करें।
एजेंट और माइक्रोगेंटये परियोजना घटक सिस्टम के लिए विशिष्ट आवश्यकताओं के अनुसार कार्यक्षमता के आगे विस्तार के लिए आवश्यक हैं। फिलहाल, सर्वर पर केवल वेब एप्लिकेशन ही एजेंट से जुड़ा होता है और इसके कई कार्य कहलाते हैं। यह JADE वातावरण में एजेंटों की बातचीत के आधार पर एक प्रणाली के विकास में मदद करेगा, जहां प्रस्तुत परियोजना एजेंट के दृश्य मॉड्यूल में से एक है। माइक्रोगेंट, वास्तव में, उपयोगकर्ताओं की एक बहुस्तरीय प्रणाली के साथ काम को सुविधाजनक बनाने के लिए एक सहायक घटक है। प्रत्येक उपयोगकर्ता को अपने स्वयं के एजेंट के साथ प्रदान किया जाता है जिसके माध्यम से वह सिस्टम के अन्य एजेंटों के साथ बातचीत करता है। उपयोगकर्ता के साथ एजेंटों के निरंतर संचार को सुनिश्चित करने के लिए, एक माइक्रोएगेंट का उपयोग किया जाता है, जो उपयोगकर्ता के कंप्यूटर पर स्थापित होता है। माइक्रोगेंट उपयोगकर्ता को चल रही घटनाओं के बारे में सूचित करता है और मुख्य एजेंट द्वारा प्रेषित संदेश प्राप्त करता है। यह क्लाइंट पर एप्लिकेशन का लॉन्च भी प्रदान करता है (एक ब्राउज़र जो वेब पेज प्रदर्शित करता है), जो उपयोगकर्ता को अपने एजेंट के साथ बातचीत करने की अनुमति देता है।
वेब सर्वर शुरू करते समय JADE प्लेटफॉर्म पर एक नया कंटेनर और एजेंट लॉन्च करने वाले फ़ंक्शन का प्रदर्शन करें।
public boolean StartAgent() { String aName = "ZavKaf Agent - "; String aClass = "agents.ZavCafAgent"; rt= Runtime.instance(); p=new ProfileImpl(); p.setParameter("container-name","ZavKaf_Agent"); mainCont=rt.createAgentContainer(p); try { Object[] temp=new Object[1]; temp[0]=testSoul; ac=mainCont.createNewAgent(aName, aClass, temp); ac.start(); agSt=true; System.out.println("Agent Start"); return true; } catch (Exception ex) { testSoul.setA(null); System.out.println("Agents ERROR: " + ex); return false; } }
पाठ्यक्रम के कार्यात्मक निर्माण के लिए जिम्मेदार एजेंट मॉड्यूल में से एक का कॉल नीचे दिखाया गया है।
public mAlgRes doAlgorithm(List<mDiscipline> curL, mCurriculum curriclum, List<mControlForm> cf) { return Agents.getA().doAlg(curL,curriclum,cf); }
यहां, एजेंट एक क्लास ऑब्जेक्ट है जो सक्रिय एजेंटों और वर्तमान वेब एप्लिकेशन से जुड़े एजेंट के बारे में डेटा संग्रहीत करता है।