Caché+ Java + Flex、またはカリキュラム管理システムの実行方法

このシリーズの記事では、このバンドルを使用する主な側面を詳細に検討しようとします。 この組み合わせを使用して、プロジェクトのサブ問題の1つを実装し、教育計画の自動管理用のインテリジェントシステムを開発しました。 よりよく理解するために、プロジェクト自体についていくつかの言葉を言う価値があります。



カリキュラムの小さな変更は、大学のサービスにおける処理と調整のために莫大な人件費につながるため、学部長はそれらを変更することに消極的です。 プロジェクトの目的は、カリキュラムを作成して変更できる部門長のエージェントを作成し、特定の調整の場合にユーザーがカリキュラムを再設計するという日常的な作業の負担を感じさせないようにすることです。



計画どおり、アシスタントおよびコンサルタントであるエージェントは、カリキュラム形成プロセスの各参加者(部門長など)にアタッチされます。 JADE (Java Agent Development Framework)は、そのようなエージェントを簡単に実装し、その動作を処理するツールとして選択されました。



DBMSとして、InterSystemsのCachéが使用されました。 DBMSは、いくつかの理由で選択されました。 まず、このDBMSは、データにアクセスするためのオブジェクトアプローチをサポートします。これにより、作業が大幅に容易になります(さまざまな言語でクラスのプロジェクションを作成できることは別ですが、これについては以下で説明します)。 第二に、このシステムでは、ユーザーのアクセスエリアを簡単に構成できます。これは将来便利になります。 そして最後に、インターシステムズは製品を使用する開発者を強力にサポートし、大学のライセンスも無料で提供しています。



将来の使用での利便性とモビリティのために、システムをクロスプラットフォームにすることが決定されました。 システムのWebインターフェイスを実装するために、フレックステクノロジーが選択されました(フラッシュの基本機能を拡張)。

その結果、開発の最初の段階で、いくつかのタスクが特定されました。これについては、今後議論します(実際、この一連の記事ではこれらのタスクを検討します)。



4番目の問題を解決するために、GraniteDSフレームワークが選択されました。この作業の詳細については、次の記事で説明します。

その結果、結果のアーキテクチャは次のように表すことができます。



上記に加えて、接続エージェントがクライアントにインストールされます。これにより、JADEエージェントとの常時通信が保証され、メインエージェントによって送信されたイベントとメッセージについてユーザーに通知されます。

最初の部分では、Cache -Javaの相互作用に注意を集中します。

教育計画管理(MAS UUP)のマルチエージェントシステムで部門長のエージェントが機能するために使用されるCachéデータベースの構造の断片を考えてみましょう。 ストアドクラスは、Cachéスタジオで設計および実装されました。



部門長のエージェント用のCachéデータベースのフラグメントは、6つの保存されたクラスで構成されます。その主なものは、カリキュラムのコンパイルに必要なすべての特徴を含む分野のクラス(cDiscipline)です。 上の図から、専門分野はサイクルと学期に分かれており、それらは専門分野とともに特定の方向のカリキュラムに含まれていることがわかります。 規律は基本的なもので、他のいくつかの規律を組み込むことができます。これは親関係によって実装されます。 ディシプリンとcControlFormクラスの関係は、ディシプリンのコントロールの形式(試験またはテスト)を定義します。 カリキュラムには、それに加えられた変更のリストも含まれています(cLogsクラス)​​。

Javaのアプリケーションロジックを使用して、一連のCachéストアドクラスを後で実装するために、 標準の投影メカニズムを使用して、Java投影のクラスが生成されました。 以下は、CachéクラスでJavaプロジェクションを作成するためのコードです。

Projection PrjName As %Projection.Java(ROOTDIR = "c:\Out\"); //PrjName –  , ROOTDIR –     java
      
      





前述のように、Cachéデータベースとの通信の組織化は、Javaプロジェクションメカニズムと、JDBCを介した通信用にCachéで提供されるライブラリを使用して実行されました。

この段階での開発を容易にするために、mクラスの層が作成されました。これにより、java-projections(cクラス)のクラスを取り除くことができます。



なぜこれが行われるのですか? この図では、Cachéによって生成された説明されたシステムのJava投影クラスが、クラス「Java c-classes」のパッケージとして示されています。 Java m-classesパッケージにはクラスが含まれ、各クラスはJava c-classesパッケージのクラスに対応しています。 Java mクラスは、cパッケージのクラスのプロパティのみを繰り返し、さらにそのget()およびset()メソッドを含みます。 このアプローチは、Cachéでのわずかな変更の後、必要なCachéクラスのJavaプロジェクションを再生成し、置換を行うだけで十分であるため、Cachéクラスの絶え間ない変更に便利です(そして、mクラスの変更は、新しく作成されたプロジェクションの編集よりもはるかに簡単です)。 さらに、この段階でのこのアプローチは、マイクロトランザクションの編成に役立ちます。 たとえば、まだc-に保存されていない(特に、アルゴリズムに必要な)mクラスへの変更を簡単にロールバックできます。 また、Javaはクローン作成を直接サポートしていないという事実を考慮すると、このようなマイクロトランザクションは作業を非常に容易にします。 さらに、ActionScriptプロジェクションを作成するGranite DSでは、メインクラスにいくつかの変更が必要です(これについては記事の第2部で説明します)。Cクラスの構造を部分的に書き換えるよりも、mクラスにそのような変更を加える方が簡単です。 したがって、このアプローチはメイン開発段階での作業を大幅に促進しますが、最適化段階ではこのソリューションを作り直すことができます。



したがって、たとえば、効率とメモリの観点から、このアプローチはあまり魅力的ではありません。 そして、将来的には、Granite DSが動作するために必要なSerializableインターフェースをc-classesに実装することにより、おそらくそれから遠ざかる必要があります。

CacheTransformクラスは、CachéデータベースとJavaクラス間のリンクです。 このクラスは、Cachéデータベースを操作する2つの方法を実装します。JDBCを使用する方法とJavaプロジェクションを使用する方法です。 JDBCを介したデータベースとの通信を確保するために、CacheTransformクラスはデータベース接続機能を実装します。 この関数の実装は、cachedbライブラリで提供されるDatabaseクラスのオブジェクトを使用します。 以下は、データベース接続機能のコードです。

 public Boolean InitCon(String port, String user, String pass) { try { username=user; password=pass; url="jdbc:Cache://localhost:"+port+"/IKIT"; dbconnection = CacheDatabase.getDatabase(url, username, password); connect=true; try{ setParams(port,user,pass); }catch (IOException er){System.out.println("[Error of IO]: "+er);} return true; } catch (CacheException e) { e.printStackTrace(); return false; } }
      
      





InitCon関数は、基本的な接続パラメーター(ポート-ポート番号、ユーザー-ユーザー名、パス-Cachéに接続するためのパスワード)を受け入れ、対応するグローバル変数に入力して、データベースへの接続を試みます。 接続に成功すると、現在のパラメーターがsetParams(ポート、ユーザー、パス)関数によって構成ファイルに入力されます。 また、javaアプリケーション自体とデータベースは同じマシン上にあるため、urlがlocalhostを使用することに注意する価値があります。将来、データベースが実行されているマシンのアドレスとデータベース領域(この例では、エリア)の両方を受け入れるようにこの関数を統合する価値があります-IKIT)。

次に、Cachéデータベースからデータを読み取る手順を検討します。 CacheTransformクラスでは、各Javaプロジェクションクラスに対して1組の関数が実装されます。1つはIdによって1つのクラスオブジェクトを読み込み、もう1つはすべてのクラスオブジェクトを読み込みます。 以下が与えられます

cControlFormクラスのオブジェクトをロードするためのサンプルコード。
 ///      public mControlForm ReadOneCont(Integer ind) { try { if(connect == true) { cControlForm temp = (cControlForm) cControlForm._open(dbconnection, new Id(ind)); return TranformCF(temp); } return null; } catch (CacheException e) { e.printStackTrace(); return null; } } ///      public void ReadAllCont() { try { if(connect == true) { ListOfCF.clear(); Iterator k = dbconnection.openByQuery("SELECT IKIT.cControlForm.%ID FROM IKIT.cControlForm"); while (k.hasNext()) { ListOfCF.add(TranformCF((cControlForm)k.next())); } } } catch (CacheException e) { e.printStackTrace(); } }
      
      







この例は、Idによって1つのオブジェクトをロードするために、javaプロジェクションクラスの_open関数が使用され、すべてのオブジェクトをロードするために、SQLクエリが渡されるDatabaseクラスのdbconnectionオブジェクトのopenByQuery関数が呼び出されることを示しています。 IKIT.cControlForm。%IDがオブジェクトのコレクションを返すことは注目に値します。 次に、両方の関数でTranformCFメソッドが呼び出されます。

 ///   public mControlForm TranformCF(cControlForm cur) { try{ mControlForm res=new mControlForm(); res.setId(Integer.parseInt(cur.getId().toString())); if(cur.getZET()!=null) res.setZet(cur.getZET().floatValue()); res.setName(cur.getName()); return res; } catch (CacheException e) { e.printStackTrace(); return null; } }
      
      





説明からわかるように、このメソッドはcクラスオブジェクトを受け取り、成功した場合はmクラスオブジェクトを返します。 特に、このメソッドはControlFormクラスで機能します。

Cachéデータベースにデータを保存する順序は、ロードプロセスに似ており、CacheTransformクラスにも実装されています。 以下は、cControlFormクラスのデータを保存する例です。

cControlFormソースコード
 ///   public cControlForm RevTranformCF(mControlForm cur, Integer act) { try { cControlForm res = null; if (act == 1) { System.out.println("//MAS: TRY EDIT CF: "+ act.toString() + "\nID:" + cur.getId().toString()); res = (cControlForm) cControlForm._open(dbconnection, new Id(cur.getId())); } else { System.out.println("//MAS: TRY ADD CF"); res = new cControlForm(dbconnection); } res.setName(cur.getName()); if(cur.getZet() != null) res.setZET(cur.getZet().doubleValue()); res._save(); return res; } catch (CacheException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. return null; } }
      
      







この例では、RevTranformCFのactへの入力引数は1または0です。actが1の場合、クラスcControlFormのオブジェクトがデータベースからロードされ、それ以外の場合、クラスcControlFormの新しいオブジェクトが作成されます。 次に、値がcControlFormオブジェクトの属性に割り当てられ、保存関数が呼び出されます。

CacheTransformクラスのオブジェクトのメソッドの呼び出しは、WebアプリケーションのActionScriptクラスによって順番に使用されるIUserServiceインターフェイスを実装するUserServiceクラスで実行されます。 このリンクの詳細については、記事の次の部分で説明します。



記事のこの部分の結果を要約すると、このケースでは、Cache Javaプロジェクションを使用すると作業が大幅に促進されたと言えます。これにより、リンク「Cache class」-「Data」-「Java class」をバイパスして、DBMSデータを主な作業に委ねることができます。 投影はOOPの観点からより便利です。クラスを直接操作するため、データ処理のためにjavaクラス構造を手動で作成する必要がないためです。 そのため、たとえば、事前に型を知る必要があるデータを返すことが多いSQLクエリの代わりに、get()、set()メソッドを使用して型付きデータを取得します。 特に、Cacheクラスをコンパイルする際のプロジェクションクラスの再生成により、JDBCを介した通信を使用する場合に見られるJavaクラスに大幅な変更を加える必要がなくなります。



基本構造については、最適化の段階で、読み取りと書き込みの機能を統一する必要があります。また、重複からクリーンな投影に移行する必要があります。



この記事の次の部分では、 Caché-Javaを実装するプロジェクトの一般的な構造(Flex通信、対話メカニズム、およびこれに使用されるツール)について説明します。 システム自体はここで表示できます



All Articles