新的Drools6.xKieAPI是如何工作的?

新的Drools6.xKieAPI是如何工作的?,drools,Drools,我正在尝试从Drools 5.x升级到6.x,并尽可能让事情变得简单。新的kieapi使得这个简单的任务变得困难 经过多次尝试,我成功地将标准的Drools 5.x示例转换为6.x版本。请注意,我故意避免使用XML配置文件、依赖项注入等,但我仍然不理解一些段落 我包括这两个版本的应用程序,可能会帮助其他人谁面临同样的问题,我有 下面的代码或多或少是我们在Drools 5.x中使用的代码: // Obtain a builder for knowledge base KnowledgeBuilde

我正在尝试从Drools 5.x升级到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();
服务
返回一个
kie存储库
,其默认版本id用于初始化
kie容器
。此容器生成一个
KieBase
,在需要时创建
KieSession
s请注意,包含DRL文件的文件系统的先前初始化的
KieBuilder
未在任何地方用于获取
KieBase
KieBase如何知道DRL文件?通过
服务中的一些副作用
?如果是这样,这不是很糟糕吗


提前感谢您的任何想法或解释。

Stefano,如果您只对在应用程序中加载一堆drl感兴趣,并且不担心KieContainers、Maven工件或KieScanner,您可以使用该类

有关更多信息,请查看

这里唯一的缺点是KieHelper不是Drools公共API的一部分


希望能有所帮助,

这里没有什么可回答的:您在问题中已经很好地表达了这一切!我倾向于同意你的观点,一些构建者在文件系统上工作,而一个容器使用某个存储库ReleaseId创建,并生成一个KieBase(这一定是构建者炮制的)这一内在关系绝对令人困惑。我已经阅读了Drools文档,但它根本无法解释这些实体之间的联系——它只是描述了每个实体的属性,你应该从中推断出要点。@laune我很高兴看到你分享我的观点!老实说,Drools文档从来没有因为准确和详尽而被人记住(至少从我第一次使用v4.3开始)。我刚刚偶然发现了一些简单的规则(),这些规则可能很愚蠢(例如:缺少RETE/OO、PHREAK),但要简洁得多,没有虚饰!尽管规则和beta节点的处理方式没有得到优化,但我还是喜欢它。实际上EasyRules在功能上无法与成熟的生产规则系统相媲美,但它的一个端口MintRules()很有希望。嗨,Esteban,很高兴再次读到您的来信!谢谢,helper类确实简化了代码,但是它仍然不能帮助理解引擎盖下发生了什么。。。无论如何,
kieheloper
是否允许在运行时向会话添加规则?(见这个问题:)你好,斯蒂法诺。不,如果您想在运行时修改Kiebase,您可能需要查看Drools 6.x中的
KieScanner
类。
KieRepository repository = services.getRepository(); // <---= HERE!