2016-04-08 4 views
4

私はDrools 5.xから6.xにアップグレードし、できるだけシンプルにするよう努めています。新しいkie APIはこの単純な作業を難しくしています。新しいDrools 6.x KIE A​​PIはどのように機能しますか?

多くの試みの後で、私は標準の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のいくつかの副作用を通して?もしそうなら、これは悪くないですか?

ありがとうございました。

+0

ここでは何も答えません。あなたの質問には非常にうまくいきました。そして、私は、FileSystemと、いくつかのRepository ReleaseIdで作成されたKieBase(Builderが作成したものでなければならない)を作成したコンテナで作業するBuilderのこの固有の関係が絶対に困惑していることに同感します。私はDroolsのドキュメントを読んできましたが、これらのエンティティ間の*接続*については説明できません。各エンティティのプロパティを説明するだけで、必要なものを推測することになります。 – laune

+0

@laune私はあなたが私の意見を分かち合うのを見てうれしいです!正直言って、Droolsのドキュメントは、正確で網羅的であることは記憶されていません(少なくとも私が使ったv4.3以来)。私はちょっと愚かかもしれない(すなわち:RETE/OO、PHREAKがない)簡単なルール(http://www.easyrules.org)に遭遇しましたが、はるかにコンパクトでフリルなしです!ルールやベータ・ノードの扱い方が最適化されていないにもかかわらず、私はそれが好きです。 –

+0

実際、EasyRulesは本格的なプロダクションルールシステムと機能的には似ていませんが、そのポートの1つ(MintRules(https://github.com/augusto/MintRules))は有望です。 –

答えて

0

Stefano、アプリケーションでたくさんのdrlをロードするだけで、KieContainer、Mavenの成果物またはKieScannerが心配されていない場合は、KieHelperクラスを使用できます。

詳細については、my answer to this other postを確認してください。

ここでの唯一の欠点は、KieHelperがDroolsのパブリックAPIの一部ではないことです。

希望します。

+1

こんにちはエステバン、もう一度お読みください! とにかく実行時にセッションにルールを追加できるようにするには、 'KieHelper'がありますか?ありがとうございます。ヘルパークラスは実際にコードを単純化していますが、それでも何が起こっているのか理解できません。 (この質問を参照してください:http://stackoverflow.com/questions/36502310/how-to-dynamically-change-the-ules-of-a-given-drools-6-3-session) –

+0

こんにちはステファノ。いいえ、実行時にKieBasesを変更したい場合は、Drools 6.xの 'KieScanner'クラスを見てみてください。 –

関連する問題