私が現在取り組んでいるアプリケーションでは、ある種のサービスに対する何万ものオブジェクトの適格性を定期的にチェックする必要があります。決定図自体は次の形式で、はるかに大きくなっています。
各エンドノード(円)で、アクションを実行する必要があります(オブジェクトのフィールドの変更、情報のログなど)。Drool Expertフレームワークを使用してみましたが、その場合、エンドノードにつながるダイアグラム内のすべてのパスに対して長いルールを作成する必要があります。Drools Flowも、そのようなユースケース向けに構築されていないようです。オブジェクトを取得し、途中の決定に応じて、エンドノードの1つに到達します。そして再び別のオブジェクトのために。またはそれは?そのようなソリューションの例/リンクをいくつか教えてください。
アップデート:
Drools Flowの呼び出しは、次のようになります。
// load up the knowledge base
KnowledgeBase kbase = readKnowledgeBase();
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
Map<String, Object> params = new HashMap<String, Object>();
for(int i = 0; i < 10000; i++) {
Application app = somehowGetAppById(i);
// insert app into working memory
FactHandle appHandle = ksession.insert(app);
// app variable for action nodes
params.put("app", app);
// start a new process instance
ProcessInstance instance = ksession.startProcess("com.sample.ruleflow", params);
while(true) {
if(instance.getState() == instance.STATE_COMPLETED) {
break;
}
}
// remove object from working memory
ksession.retract(appHandle);
}
つまり、アプリケーションオブジェクトを取得し、そのための新しいプロセスを開始します。プロセスが終了したら(最後のアクションノードはアプリケーションを何らかの方法で変更します)、作業メモリからオブジェクトを削除し、次のプロセスを繰り返します。新しいAppオブジェクト。このソリューションについてどう思いますか?
解決策:
Drools Flowを使用することになり、非常に正常に機能しています。私の意思決定プロセスは、Drools Expertが要求するほど単純ではなく、意思決定ツリーのどこにあるかによって、データベースからオブジェクトのリストをロードし、変換し、意思決定を行い、すべてをログに記録する必要があります。私はProcessオブジェクトを使用します。これはパラメーターとしてプロセスに渡され、すべてのグローバル変数(プロセス用)と、ツリー内のさまざまなポイントで繰り返されるいくつかの便利なメソッドを格納します(Script Task
ノードでのJavaコードの記述自体はあまり便利ではないため)。また、Javaを使用して意思決定を行うことになりました(mvel
ルールではありません)。Javaの方が高速で、制御が簡単だと思います。私が使用するすべてのオブジェクトはパラメーターとして渡され、コード内で通常のJava変数として使用されます。