新的Drools6.xKieAPI是如何工作的?
我正在尝试从Drools 5.x升级到6.x,并尽可能让事情变得简单。新的新的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
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!