- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这几天我一直在尝试在 Netbeans 中运行 Drools,但它并没有像我想要的那样工作。我什至尝试让它作为一个 Maven 项目工作,但效果不佳。我描述了我是如何创建该项目的,希望有人能给我提示。
首先,我需要它在没有 Maven 的情况下工作,因为我被限制不能使用它。但在将它放入实际项目之前,我想测试它。
所以首先我创建一个新项目
在项目中创建 lib 文件夹并将以下 jar 放入其中:
通过此设置,我创建了类(都在包中:Drools)DroolsMain(无需网络服务器和 GUI 进行测试,以加快调试速度)
public class DroolsMain {
private static KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
private static Collection<KnowledgePackage> pkgs;
private static KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
private static StatefulKnowledgeSession ksession;
public static void main(final String[] args) {
init();
initMessageObject();
fireRules();
}
private static void init() {
String myRule = "import Drools.Message rule \"Hello World 2\" when message:Message (type==\"Test\") then System.out.println(\"Test, Drools!\"); end";
Resource myResource = ResourceFactory.newReaderResource((Reader) new StringReader(myRule));
kbuilder.add(myResource, ResourceType.DRL);
if(kbuilder.hasErrors()) {
System.out.println(kbuilder.getErrors().toString());
throw new RuntimeException("unable to compile dlr");
}
pkgs = kbuilder.getKnowledgePackages();
kbase.addKnowledgePackages(pkgs);
ksession = kbase.newStatefulKnowledgeSession();
}
private static void fireRules() {
ksession.fireAllRules();
}
private static void initMessageObject() {
Message msg = new Message();
msg.setType("Test");
ksession.insert(msg);
}
}
以及上面使用的Message类
public class Message {
private String type;
private String message;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
我现在可以运行该代码并返回消息。
现在我想和 Kie 一起尝试...
我只是注释了 DroolsMain main() 方法中的方法。并将 Kie 方法放入当前 Drools 文档 p 中。 172-174 那里:
private static void kieTest() {
KieServices kieServices = KieServices.Factory.get();
KieContainer kContainer = kieServices.getKieClasspathContainer();
StatelessKieSession kSession = kContainer.newStatelessKieSession();
Applicant bob = new Applicant("Mr. Bob", 16);
//assertTrue(bob.isValid());
kSession.execute(bob);
//assertFalse(bob.isValid());
}
我没有将 Applicant.class 放在这里,因为它只是一个具有 3 个属性的 bean。我还创建了 DRL applicant.drl 文件:
package Drools "Is of valid age"
import Drools.Applicant
when
$a : Applicant(age < 18)
then
$a.setValid(false);
end;
所以这显然不起作用,因为 Kie 有 Maven 依赖项,所以我尝试了这个: 1.添加目录: - DroolsTest/资源/ - DroolsTest/资源/META-INF - DroolsTest/资源/META-INF/maven - DroolsTest/资源/Drools 2.创建DroolsTest/resources/META-INFkmodule.xml
内容:
<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="Drools" packages="Drools">
<ksession name="ksession-drools" />
</kbase>
</kmodule>
创建 DroolsTest/resources/META-INF/maven/pom.properties内容:(groupId我的包名),(artifactId我的项目名)
groupId=流口水工件Id=DroolsTest版本=1
编译它会抛出一个 RuntimeException:
Exception in thread "main" java.lang.RuntimeException: Cannot find a default KieSession
at org.drools.compiler.kie.builder.impl.KieContainerImpl.findKieSessionModel(KieContainerImpl.java:555)
at org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession(KieContainerImpl.java:548)
at org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession(KieContainerImpl.java:531)
at Drools.DroolsMain.kieTest(DroolsMain.java:43)
at Drools.DroolsMain.main(DroolsMain.java:52)
C:\Users\...\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 3 seconds)
有没有办法让 Kiew 在没有 Maven 的情况下工作,或者我可以在没有它的情况下读取文件吗?
<小时/>更新:
我尝试了劳恩斯解决方案:
import java.io.File;
import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.Results;
import org.kie.api.io.Resource;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
public class DroolsMain {
private void ntry() {
KieServices kieServices = KieServices.Factory.get();
KieFileSystem kfs = kieServices.newKieFileSystem();
File rule = new File("src/main/resources/Drools/applicant.drl");
Resource res = kieServices.getResources().newFileSystemResource(rule);
kfs.write(res);
KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll();
Results results = kieBuilder.getResults();
System.out.println("---Messages---");
System.out.println(results.getMessages());
KieContainer kieContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());
KieBase kieBase = kieContainer.getKieBase();
KieSession kieSession = kieBase.newKieSession();
}
public static void main(final String[] args) {
DroolsMain dm = new DroolsMain();
dm.ntry();
}
}
我还添加了 drools 发行版中的所有 jar。现在它可以编译并且没有错误
最佳答案
我就是这样做的,没有 Maven,没有 XML:
public void build() throws Exception {
KieServices kieServices = KieServices.Factory.get();
KieFileSystem kfs = kieServices.newKieFileSystem();
//...
Resource res = ...;
kfs.write( "src/main/resources/simple.drl", res );
KieBuilder kieBuilder = kieServices.newKieBuilder( kfs ).buildAll();
Results results = kieBuilder.getResults();
if( results.hasMessages( Message.Level.ERROR ) ){
System.out.println( results.getMessages() );
throw new IllegalStateException( "### errors ###" );
}
KieContainer kieContainer =
kieServices.newKieContainer( kieServices.getRepository().getDefaultReleaseId() );
KieBase kieBase = kieContainer.getKieBase();
kieSession = kieBase.newKieSession();
}
我通常使用诸如
之类的资源kieServices.getResources().newInputStreamResource( fis )
因为从文件读取更加灵活。
关于java - 如何让 Drools (Kie Session) 在 Netbeans Web 项目(无 Maven)中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38371941/
Drools中物理包和包声明有什么用。 例如, 我有一个规则,物理包com.mycompany中的Myrule.drl 据我所知,drools 中的包声明不依赖于文件所在的实际物理包。 所以我可以将
我是 drools 的新手,并且熟悉使用 extends 关键字来继承规则。问题有没有办法继承多个规则?这类似于在 java 类上使用多个接口(interface)。这是我希望它如何工作的示例,但我在
我们使用 Drools 作为解决方案的一部分,在非常密集的处理应用程序中充当一种过滤器,可能在 500,000 多个工作内存对象上运行多达 100 条规则。 事实证明它非常慢。 其他人有在批处理类型处
我是 Drools 的新手,正在尝试让示例程序正常工作。drools 文档 http://docs.jboss.org/drools/release/5.5.0.Final/drools-expert
我正在使用 drools-camel-server 5.4 Final 来执行从 jboss AS7 上的 guvnor 获取的规则,如下所示: 如何重新加载或重建知识库
我想将我的 .drl 文件预编译为 .class 文件,这样它们就不必在运行时编译。文档使它听起来像 kie-maven-plugin 这样做,但它没有为我生成任何东西。它编译规则文件但不输出任何内容
我正在尝试使用 Drools 向后链接来找出需要哪些事实才能将对象插入到工作内存中。在下面的示例中,我期望得到事实“go2”。 rule "ins a" when String( this =
是否可以通过规则名称触发 drool 文件中的规则?我的要求是,我的规则文件将包含所有规则的列表 (S)。但我有一个单独的配置,其中包含要触发的规则名称列表 (A)。注意 (A) 是 (S) 的子集。
我的项目使用 drools 专家手段 (DRL) 文件。在规则文件中,如果用户想删除和更新规则,应该怎么办? 规则文件: package com.sample; import com.sample.T
我被要求开始探索用于某些客户端演示的 Activiti 工具。 该演示还将包含与 Activiti 集成的 JBoss Drools。 我对这两种工具和业务流程世界都不熟悉,所以如果问题很愚蠢,请原谅
Ciao,我已经测试了几种方法,但我仍然无法在Drools Fusion中测试和验证事件过期机制,所以我正在寻找一些指导,好吗? 我已经阅读了手册,我对这个功能很感兴趣: In other words
我试图在 Drools 6.5 中创建两个独立的规则组,但我无法弄清楚规则流组和议程组策略的用例是什么。他们两个看起来很相似。 最佳答案 阅读文档... 2.6.4. RuleFowGroup 和 A
我是 Drools 新手。我正在创建规则,但出现编译时错误 "field is not visible'. 我尝试检查 Jboss 示例,其中使用方言“mvel”。它编译了。我听不懂方言。那么 dia
我正在尝试设置 kie 执行服务 (kie-server-services-6.2.0) 以供 kie-drools-wb-webapp-6.2.0 提供,当我尝试通过以下 webapp url执行服
我想实现规则引擎,其中如果仅执行一个条件,则它不会检查其他指定的条件。 rule "Print out lower-case tokens" when Token ( coveredText
我拥有所有必需的 JAR。尽管面临以下问题: java.lang.ClassCastException: org.drools.io.impl.ClassPathResource cannot be
我正在尝试 Redhat Drools,并且能够在 WildFly 环境中部署 Drools Workbench。我试图找出如何将规则公开为服务,但找不到关于如何做到这一点的文章。这是对 Drools
在使用 Drools 5.5 final 比较字符串值字段时,我遇到了一些令人费解的问题。 本质上,我试图找出是否有一对同名的人。 Person 类如下所示: public class Person
我正在寻找一个好的规则引擎。 我已经看到它存在两个好的项目:JBPM和Drools。 我不太了解两者之间的区别,也不知道要使用什么理想工具。 请您向我提供更多信息以及您在其他方面的经验,以及您认为最适
我们可以在 Excel 表格中编写 Drool 规则吗?规则可以用于简单的人类可读内容吗?如果我们可以,那该怎么做呢?请解释。 最佳答案 是的,你可以。阅读用户指南中名为“电子表格中的决策表”的部分如
我是一名优秀的程序员,十分优秀!