在Web /企业应用程序上使用Drools Fusion的最佳实践是什么?你知道有用的文件吗?
我查看了JBoss上的示例(http://download.jboss.org/drools/release/5.1.1.34858.FINAL/drools-5.1.1-examples.zip),但它们是桌面应用程序.我不明白如何在服务器上保持Drools会话"运行".
这更像是一个普遍的问题.但我试图理解使用工具的概念以及为什么需要这个工具.我一直在四处走动.
q)为什么我们需要规则引擎?
我一直在阅读Drools和ILOG规则引擎,我仍然不清楚组织使用这些工具可以获得什么好处的概念.
q)是否只是为业务用户提供了一种向数据库(存储库)发出查询(被称为规则)的方法?
与获得的收益相比,这个额外的s/w是否只会花费更多的资金用于许可证和支持?
我们总是让所有的应用程序做同样的事情.
示例:如果销售额<$ 5000000,则订单出货=否
以上是业务逻辑的示例.这很容易在程序中实现.那么通过规则引擎获得的好处是什么?
任何输入都会很棒!谢谢.
我正在考虑使用Drools Fusion来实现以下示例性规则:
所有这些规则都可以使用Drools Fusion轻松表达.然而,在创建原型并查看文档后,似乎该产品更适合短期,瞬态事件(股票市场,实时决策).
问题是:是否需要将所有事件存储在内存中?(可能有数百万的旧购买).此外,Drools Fusion可以存储事件,以便它们在服务器重启后能够存活吗 (理想情况下在数据库中).
我知道Drools Fusion事件只是Drools Expert中的事实,所以也许这个问题可以扩展到:Drools Expert能否坚持并懒惰加载事实?
Drools 文档提到规则可以使用date-effective
和等属性date-expires
来指定绝对规则有效期.
例如
rule "Date-restricted rule"
date-effective "20.2.2013 8:00" # 8 AM
date-expires "20.2.2013 16:00" # 4 PM
when
then
end
Run Code Online (Sandbox Code Playgroud)
Drools还支持使用interval as timer(int:)
和cron as 定期重复的规则,timer(cron:)
但这意味着规则在这些点中被触发.
如果有任何选项如何指定具有时间限制的定期可用(未触发)规则,我感兴趣.例如,让我们想象某个公司的营业时间 - 只能在正式工作期间而不是在工作时间之后执行操作.
我想要这样的东西,但这不是Drools的有效规则
rule "Time-restricted rule"
time-effective "8:00" # 8 AM
time-expires "16:00" # 4 PM
when
then
end
Run Code Online (Sandbox Code Playgroud)
是否可以将此规则延长至周一至周五上午8点至下午4点?
Drools没有直接支持基于时间的关键字,但它们使用Quartz库提供了更强大的日历机制.StatefulSession
或者WorkingMemory
通过StatelessSession
具有定义这些日历的方法创建,这些日历可以限制可以触发规则的日期和时间.
示例: 规则定义
rule "Business hours only"
calendars "business-hours"
when
SomeAttachedClass()
then
System.out.println("Rule is …
Run Code Online (Sandbox Code Playgroud) 我一直在研究如何简化我用DRL手动编写的一些规则,这些规则变得难以维护.
通过谷歌搜索导致"决策表是最好的方式去forawad".
但遗憾的是我们的事实非常复杂,所以当下drools电子书转换器,无法处理如此复杂的事实,
所以第一个问题是开发人员通常如何处理drools知识库中非常复杂的事实?
例如,我们有类似的事实
Person->List<Cars>->List<Insurances>->Each insurance Has List<History>
Run Code Online (Sandbox Code Playgroud)
现在我必须写一条规则,说人有他的保险索赔的糟糕历史.然后我发现将它放在speadsheet中非常困难,因为它更容易在drl文件上手动编写此规则.
谢谢您的帮助.对上述示例的任何帮助也都非常好.
我有一个关于SPOCK + Drools测试的问题.这是事情,
KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder();
Run Code Online (Sandbox Code Playgroud)
在JUnit测试用例中,这行代码完全正常.它不在SPOCK内.
我得到以下异常,
java.lang.NoClassDefFoundError: com/sun/tools/xjc/Options
at org.codehaus.groovy.util.LazyReference.getLocked(LazyReference.java:46)
at org.codehaus.groovy.util.LazyReference.get(LazyReference.java:33)
Caused by: java.lang.ClassNotFoundException: com.sun.tools.xjc.Options
... 3 more
Run Code Online (Sandbox Code Playgroud)
可能是什么问题呢?流口水相关吗?无法解决问题.任何帮助深表感谢 :)
更新:
我正在部署一个webapp内部运行测试(如果这有意义:)).我将jar添加到类路径(不是WEB-INF/libs),现在工作正常.
我是新来的WSO2 BRS
.WSO2 BRS
声称支持Drools.但我找不到上传drools文件(.drl扩展名文件)的方法.我如何支持Drools WSO2 BRS
.
我正在使用JBoss AS 7.1.1.Final和KIE Workbench/Drools 6.0.1.,Java和Eclipse(Kepler).
我需要KIE Workbench(以前称为Drools Guvnor)让人们用Facts和Rules以图形方式创建/编辑jar,然后将其作为jar存储在本地maven存储库中.这些罐子(以前称为pkg)然后我想以编程方式访问并将它们加载到我的Drools应用程序中.应用程序甚至可以(虽然不是优选地)在同一工作站上运行,因此可以访问存储库
a)通过URL:
http://localhost:8080/drools-wb-as7.0/maven2/com/myprojects/myProject/LATEST/myProject-LATEST.jar
b)通过filepath/classpath:
/my/folder/jboss-as-7.1.1.Final/bin/repositories/kie/com/myprojects/myProject/LATEST/myProject-LATEST.jar
我不希望创建/编译动态规则等在我的代码,无论是动态加载一个.drl文件-准备好的罐子是我需要加载,如与com.myprojects:myProject的:最新作标识.
我试试这个(根据文件)
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.newKieContainer(
ks.newReleaseId("com.myprojects", "myProject", "LATEST"));
KieScanner kScanner = ks.newKieScanner( kContainer );
kScanner.start( 10000L );
KieSession kSession = kContainer.newKieSession("defaultKieSession");
kSession.insert( fact );
Run Code Online (Sandbox Code Playgroud)
[...]
但是,这会因Runtime Exception而失败,
Exception in thread "main" java.lang.RuntimeException: Cannot find KieModule: com.myprojects:myProject:LATEST
at org.drools.compiler.kie.builder.impl.KieServicesImpl.newKieContainer(KieServicesImpl.java:86)
at com.myprojects.myproject.KieDroolsWBOnlinePuller.code(KieDroolsWBOnlinePuller.java:118)
at com.myprojects.myproject.KieDroolsWBOnlinePuller.main(KieDroolsWBOnlinePuller.java:40)
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么没有找到回购罐?当我在KIE WB中创建它时,KieModule不是回购中jar和jar的表示吗?或者我必须更改打印出的Maven Repo的默认ReleaseID
KieRepository repo = ks.getRepository();
repo.getDefaultReleaseId()
Run Code Online (Sandbox Code Playgroud)
解决了
org.default:artifact:1.0.0-SNAPSHOT ?
Run Code Online (Sandbox Code Playgroud)
这是Maven的问题吗?我错了什么?
这里是jar的内容pom.xml
<?xml version="1.0" encoding="UTF-8"?> …
Run Code Online (Sandbox Code Playgroud) 我正在使用Drools 5.6.0,我已准备好升级到6.0,因此这个问题与两个版本都相关.
我已经搜索了很多关于在多线程环境中使用Drools的内容,我仍然不确定如何继续.在下面的场景中,我试图找到一种方法,将使用大量静态事实预先初始化的单例StatefulKnowledgeSession用作Web服务的业务逻辑.
我想知道下面进一步描述的场景是否有最佳实践.
我在服务器启动时创建一个StatefulKnowlegdeSession单例
在初始化时,我将超过100.000个事实插入到StatefulKnowlegdeSession中.我把这些称为" 静态事实 ",因为它们不会被规则修改.静态事实更像是一组大查找表.
现在,规则引擎被放入Web服务(Tomcat)中.Web服务接收将插入到KnowledgeSession中的Request对象.在fireAllRules()之后,我希望KnowledgeSession计算一个输出对象,该输出对象将作为Web服务响应返回.
响应的计算使用静态事实.规则创建了许多临时对象,这些对象使用insertLogical()插入到工作内存中.这样可以确保在Web服务调用结束时收回原始Request对象后,将从工作内存中删除所有垃圾.
现在的问题是我将如何在多线程服务器中完成这项工作?
我想尽可能只使用一个StatefulKnowledgeSession实例(单例),因为静态事实是BIG,它可能成为内存问题.
我不能使用在每个Web服务调用开始时新创建的StatelessKnowledgeSessions,因为插入所有静态事实将花费太长时间.
我知道StatefulKnowlegdeSession不是线程安全的.此外,不再支持分区选项.
但是,可以从不同的线程使用不同的WorkingMemoryEntryPoints/EntryPoints.我可以使用EntryPoints 池,每个Web服务调用将使用池中的一个实例来插入Web服务请求.
这也意味着我需要使用一个特定的EntryPoint,或者至少第一个匹配Web服务请求对象的规则,将每个规则(?)相乘:
rule “entry rule for WORKER-1” // rule to be duplicated for entry points WORKER-2, WORKER-3,...
when
$req : Request () from entry-point “WORKER-1”
$stat : StaticFact( attr = $req.getAttr() )
then
insertLogical( new SomeTemporaryStuff …
Run Code Online (Sandbox Code Playgroud) 我正在研究一种服务,该服务可以转换,转换和规范化作为半结构化json接收的记录。要求如下:
当然,这些要求与Java相反,并且其他文章中的评论(尽管几年前)已经指出,使用Drools处理json很难。
是否有办法在上述情况下和谐地应用Drools,或者是否有最小的限制(除了采用强数据模型的明显解决方案之外)可以纠正这种情况?
drools ×10
java ×5
groovy ×1
jar ×1
java-ee ×1
kie ×1
rule-engine ×1
spock ×1
web-services ×1
wso2 ×1
wso2carbon ×1
wso2esb ×1