标签: drools

Drools Fusion和Java EE

在Web /企业应用程序上使用Drools Fusion的最佳实践是什么?你知道有用的文件吗?

我查看了JBoss上的示例(http://download.jboss.org/drools/release/5.1.1.34858.FINAL/drools-5.1.1-examples.zip),但它们是桌面应用程序.我不明白如何在服务器上保持Drools会话"运行".

drools java-ee drools-fusion

5
推荐指数
1
解决办法
795
查看次数

使用规则引擎背后的推理

这更像是一个普遍的问题.但我试图理解使用工具的概念以及为什么需要这个工具.我一直在四处走动.

q)为什么我们需要规则引擎?

我一直在阅读Drools和ILOG规则引擎,我仍然不清楚组织使用这些工具可以获得什么好处的概念.

q)是否只是为业务用户提供了一种向数据库(存储库)发出查询(被称为规则)的方法?

与获得的收益相比,这个额外的s/w是否只会花费更多的资金用于许可证和支持?

我们总是让所有的应用程序做同样的事情.

示例:如果销售额<$ 5000000,则订单出货=否

以上是业务逻辑的示例.这很容易在程序中实现.那么通过规则引擎获得的好处是什么?

任何输入都会很棒!谢谢.

rule-engine drools

5
推荐指数
1
解决办法
1231
查看次数

Drools Fusion支持持久的长期运行事件

我正在考虑使用Drools Fusion来实现以下示例性规则:

  • 如果顾客在一年内购买了两件相同的产品,她将免费获得第三件
  • 为了在最多连续三次交易中花费超过200美元,客户可以获得折扣
  • 当客户闲置超过一年时,会生成提醒
  • 当单个订单大于最后六个monhts内的平均订单价值时,将通知主管
  • ......等等,这些只是我头脑中的例子

所有这些规则都可以使用Drools Fusion轻松表达.然而,在创建原型并查看文档后,似乎该产品更适合短期,瞬态事件(股票市场,实时决策).

问题是:是否需要将所有事件存储在内存中?(可能有数百万的旧购买).此外,Drools Fusion可以存储事件,以便它们在服务器重启后能够存活吗 (理想情况下在数据库中).

我知道Drools Fusion事件只是Drools Expert中的事实,所以也许这个问题可以扩展到:Drools Expert能否坚持并懒惰加载事实?

java drools complex-event-processing drools-fusion

5
推荐指数
1
解决办法
2257
查看次数

Drools:时间限制规则

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点?


解决方案(由Esteban Aliverti提供):

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)

java drools

5
推荐指数
1
解决办法
7076
查看次数

流口水的复杂事实

我一直在研究如何简化我用DRL手动编写的一些规则,这些规则变得难以维护.

通过谷歌搜索导致"决策表是最好的方式去forawad".

但遗憾的是我们的事实非常复杂,所以当下drools电子书转换器,无法处理如此复杂的事实,

所以第一个问题是开发人员通常如何处理drools知识库中非常复杂的事实?

例如,我们有类似的事实

Person->List<Cars>->List<Insurances>->Each insurance Has List<History>
Run Code Online (Sandbox Code Playgroud)

现在我必须写一条规则,说人有他的保险索赔的糟糕历史.然后我发现将它放在speadsheet中非常困难,因为它更容易在drl文件上手动编写此规则.

谢谢您的帮助.对上述示例的任何帮助也都非常好.

drools drools-guvnor

5
推荐指数
1
解决办法
5543
查看次数

Spock + Drools测试

我有一个关于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),现在工作正常.

groovy drools spock

5
推荐指数
1
解决办法
458
查看次数

如何将Drools Drl文件与WSO2业务规则服务器一起使用

我是新来的WSO2 BRS.WSO2 BRS声称支持Drools.但我找不到上传drools文件(.drl扩展名文件)的方法.我如何支持Drools WSO2 BRS.

drools wso2 wso2esb wso2carbon

5
推荐指数
1
解决办法
745
查看次数

为什么将Drools 6 KIE JAR加载到代码失败?

我正在使用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)

java jar drools drools-guvnor kie

5
推荐指数
1
解决办法
1万
查看次数

Drools singleton StatefulKnowledgeSession作为Web服务

我正在使用Drools 5.6.0,我已准备好升级到6.0,因此这个问题与两个版本都相关.

我已经搜索了很多关于在多线程环境中使用Drools的内容,我仍然不确定如何继续.在下面的场景中,我试图找到一种方法,将使用大量静态事实预先初始化单例StatefulKnowledgeSession用作Web服务的业务逻辑.

我想知道下面进一步描述的场景是否有最佳实践.

  1. 我在服务器启动时创建一个StatefulKnowlegdeSession单例

  2. 初始化时,我将超过100.000个事实插入到StatefulKnowlegdeSession中.我把这些称为" 静态事实 ",因为它们不会被规则修改.静态事实更像是一组大查找表.

  3. 现在,规则引擎被放入Web服务(Tomcat)中.Web服务接收将插入到KnowledgeSession中的Request对象.在fireAllRules()之后,我希望KnowledgeSession计算一个输出对象,该输出对象将作为Web服务响应返回.

  4. 响应的计算使用静态事实.规则创建了许多临时对象,这些对象使用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)

java multithreading web-services drools

5
推荐指数
1
解决办法
1618
查看次数

使用流口水以松散构造的JSON实体形式处理事实的优雅方法?

我正在研究一种服务,该服务可以转换,转换和规范化作为半结构化json接收的记录。要求如下:

  • 相同类型(类型-人,地址等)的传入json实体可能不具有相同的属性。
  • 某些属性可能不会出现在给定类型的每个实体中。
  • 可以重命名属性。
  • 传入的json实体最初未输入类型。可以通过分析可用字段来确定传入实体的类型。因此,我认为需要使用规则将实体重新分类为Drools / Java类。
  • 不能保证给定属性中的数据总是相同类型的(尽管所有内容都可以默认为字符串)。

当然,这些要求与Java相反,并且其他文章中的评论(尽管几年前)已经指出,使用Drools处理json很难。

是否有办法在上述情况下和谐地应用Drools,或者是否有最小的限制(除了采用强数据模型的明显解决方案之外)可以纠正这种情况?

java drools

5
推荐指数
1
解决办法
2158
查看次数