私はDrools 5.xから6.xにアップグレードし、できるだけシンプルにするよう努めています。新しいkie
APIはこの単純な作業を難しくしています。新しいDrools 6.x KIE APIはどのように機能しますか?
多くの試みの後で、私は標準のDrools 5.xの例を6.xに相当するものに変換しました。私は意図的にXML設定ファイル、依存関係注入などを避けたことに注意してください。しかし、私はまだいくつかの箇所を理解していません。
私は同じ問題に直面している他の人を助けるために、アプリケーションの両方のバージョンを用意しています。
次のコードは、多かれ少なかれ、我々はDroolsの5.xの中で行うために使用されたか:
// Obtain a builder for knowledge base
KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder();
// Load a DRL resource from src/main/resources into the builder
String location = "/drools/HelloWorld.drl";
InputStream stream = getClass().getResourceAsStream(location);
Resource resource = ResourceFactory.newInputStreamResource(stream);
builder.add(resource, ResourceType.DRL);
// Check for errors, print them and stop if any
if (builder.hasErrors()) {
for (KnowledgeBuilderError error : builder.getErrors()) {
System.out.println(error);
}
System.exit(0);
}
// Create a new knowledge base out of the builder
KnowledgeBase base = KnowledgeBaseFactory.newKnowledgeBase();
base.addKnowledgePackages(builder.getKnowledgePackages());
// Start a new working session
StatefulKnowledgeSession session = base.newStatefulKnowledgeSession();
// Inject a new message object into the session
final Message message = new Message();
message.setMessage("Hello World");
message.setStatus(Message.HELLO);
session.insert(message);
// Apply the rules in the knowledge base to the objects in the session
session.fireAllRules();
// Close the working session
session.dispose();
のDrools 6.xではので、KnowledgeBase
が廃止されましたので、それ意志コードベースのうち、おそらく相で近い将来、新しいAPIを使用する必要があります。 Droolsの6.xで、上記の例は次のようになります。
// Get access to Drools services
KieServices services = KieServices.Factory.get();
// Obtain a new empty virtual file system
KieFileSystem fileSystem = services.newKieFileSystem();
// Load a DRL resource from src/main/resources into the virtual file system
// The prefix 'src/main/resources' is required since Drools 6.2.x
String location = "/drools/HelloWorld.drl";
InputStream stream = getClass().getResourceAsStream(location);
Resource resource = ResourceFactory.newInputStreamResource(stream);
fileSystem.write("src/main/resources" + location, resource);
// Convert the files in the virtual file system into a builder
KieBuilder builder = services.newKieBuilder(fileSystem).buildAll();
// Check for errors, print them and stop if any
Results results = builder.getResults();
if (results.hasMessages(ERROR)) {
System.out.println(results.getMessages());
System.exit(0);
}
// Create a new kie base out of a repository and a container
KieRepository repository = services.getRepository(); // <---= HERE!
KieContainer container = services.newKieContainer(repository.getDefaultReleaseId());
KieBase base = container.getKieBase();
// Start a new working session
KieSession session = base.newKieSession();
// Inject a new message object into the session
final Message message = new Message();
message.setMessage("Hello World");
message.setStatus(Message.HELLO);
session.insert(message);
// Apply the rules in the kie base to the objects in the session
session.fireAllRules();
// Close the working session
session.dispose();
私は、これらの新しいAPIがあまりにも冗長で理解することが少し曖昧だと思います。その背後にある理由の1つは、ルールベース(パッケージ)の管理を容易にすることですが、実装は少し畳み込まれており、ツールへの正当性を欠いています(採用がより困難です)。
xml構成ファイルや依存関係注入を使用すると、コードがはるかに簡単になりますが、前者はフローを壊し、後者は多くの依存関係を強制します。さらに、どちらの場合でも、何が起こっているのかを理解することはさらに困難になります。 KieRepository
が導入される
しかし、背中の質問に行き、第二のスニペットの行に注意してください:
KieRepository repository = services.getRepository(); // <---= HERE!
services
リターンをそのデフォルトのリリースID KieContainer
を初期化するために使用されKieRepository
。このコンテナは、必要なときにKieSession
を作成するKieBase
を生成します。 DRLファイルを含むファイルシステムを含む以前に初期化されたKieBuilder
は、KieBase
を取得するためにどこでも使用されないことに注意してください。KieBase
はDRLファイルについてどのように知っていますか? KieServices
のいくつかの副作用を通して?もしそうなら、これは悪くないですか?
ありがとうございました。
ここでは何も答えません。あなたの質問には非常にうまくいきました。そして、私は、FileSystemと、いくつかのRepository ReleaseIdで作成されたKieBase(Builderが作成したものでなければならない)を作成したコンテナで作業するBuilderのこの固有の関係が絶対に困惑していることに同感します。私はDroolsのドキュメントを読んできましたが、これらのエンティティ間の*接続*については説明できません。各エンティティのプロパティを説明するだけで、必要なものを推測することになります。 – laune
@laune私はあなたが私の意見を分かち合うのを見てうれしいです!正直言って、Droolsのドキュメントは、正確で網羅的であることは記憶されていません(少なくとも私が使ったv4.3以来)。私はちょっと愚かかもしれない(すなわち:RETE/OO、PHREAKがない)簡単なルール(http://www.easyrules.org)に遭遇しましたが、はるかにコンパクトでフリルなしです!ルールやベータ・ノードの扱い方が最適化されていないにもかかわらず、私はそれが好きです。 –
実際、EasyRulesは本格的なプロダクションルールシステムと機能的には似ていませんが、そのポートの1つ(MintRules(https://github.com/augusto/MintRules))は有望です。 –