gpt4 book ai didi

drools - 新的 Drools 6.x KIE A​​PI 是如何工作的?

转载 作者:行者123 更新时间:2023-12-03 15:00:08 24 4
gpt4 key购买 nike

我正在尝试从 Drools 5.x 升级到 6.x 并使事情尽可能简单。新kie API 使这个简单的任务变得困难。

经过多次尝试,我设法将标准 Drools 5.x 示例转换为 6.x 等效示例。请注意,我故意避开了 XML 配置文件、依赖注入(inject)等,但我仍然不明白一些段落。

我将两个版本的应用程序都包括在内,以可能帮助其他面临同样问题的人。

以下代码或多或少是我们在 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();

我认为这些新的 APIS 太冗长而且有点晦涩难懂。我知道它们背后的原因之一是允许更轻松地管理规则库(即:包),但实现有点复杂,无法公正地使用工具(即:采用更难)。

我知道使用 xml 配置文件或依赖注入(inject)可以使代码更简单,但是前者会破坏流程,而后者会强制包含(许多)更多依赖项。此外,在任何一种情况下,都变得更加难以理解正在发生的事情。

但是,回到问题,请注意第二个片段中的行,其中 KieRepository介绍:
KieRepository repository = services.getRepository(); // <---= HERE! 
services返回 KieRepository其默认版本 ID 用于初始化 KieContainer .此容器产生 KieBase创建 KieSession s 需要时。 请注意,先前初始化的 KieBuilder包含带有 DRL 文件的文件系统的文件在任何地方都不能用于获取 KieBase . KieBase知道 DRL 文件吗?通过 KieServices 中的一些副作用?如果是这样,这不是很糟糕吗?

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

最佳答案

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

欲了解更多信息,请查看 my answer to this other post .

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

希望能帮助到你,

关于drools - 新的 Drools 6.x KIE A​​PI 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36499788/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com