2

今まで、Drools 6.0.0 で実行中の KieSession にルールを追加し、事実を KieSession に保持するための最良の方法 (つまり、最小限のオーバーヘッド) を見つけることができませんでした。Drools 5 では、KBase が変更されたときに KSession が更新されましたが、私のルールは KieBase で作成されていないため、Drools 6 には同じことが当てはまらないようです。KieFileSystem 内の KieModules または Jars 全体を置き換えずにそれを行う方法はありますか? 簡単な方法があるはずだと思います。

アイデアはありますか?

よろしく

4

1 に答える 1

10

はい、ユースケースはサポートされていますが、Drools 6 ではバージョン管理されたデプロイ可能なアーティファクト (mavenized kjars) の概念が導入されていることを理解することが重要です。つまり、バージョン X で kjar を作成すると、それは不変であるはずです。kjar で定義された kbase にルールを追加/削除したい場合は、別の kjar バージョン X+1 を作成する必要があります。この kjar は、実際の jar としてディスク内に物理的に作成することも、メモリ内に作成することもできます。

また、kjar は不変のソース アーティファクトであり、kcontainer は kjar をインスタンス化し、その kbases と ksessions の使用を可能にするコンテナーであるという概念を理解することも重要です。

それがわかれば、あとはバージョン X のコンテナーをインスタンス化するだけです。kbase を変更したい場合は、コンテナーの updateToVersion(...) メソッドを呼び出して新しいバージョンに更新します。KBases と KSessions は、Drools 5 の場合と同様に、段階的に更新され、保持されます。

単体テストはこちら: https://github.com/droolsjbpm/drools/blob/master/drools-compiler/src/test/java/org/drools/compiler/integrationtests/IncrementalCompilationTest.java#L158

コードスニペット:

    // work with version 1.0.0
    ReleaseId releaseId1 = ks.newReleaseId("org.kie", "test-upgrade", "1.0.0");
    ...

    // Create a session and fire rules
    KieContainer kc = ks.newKieContainer( releaseId1 );
    KieSession ksession = kc.newKieSession();
    ksession.insert(new Message("Hello World"));
    ...

    // upgrade to version 1.1.0
    ReleaseId releaseId2 = ks.newReleaseId("org.kie", "test-upgrade", "1.1.0");
    kc.updateToVersion(releaseId2);

    // continue working with the session
    ksession.insert(new Message("Hello World"));
    ...
于 2014-03-05T20:42:59.740 に答える