我正在使用easy-rulesJSON descriptor加载规则,并且我想在 easy Rules 中使用变量。例如,我有一组规则,其中定义了规则 id、名称、描述,如下所示actions
[
{
"id": 1,
"name": "Task using Oracle DB",
"description": "Updated comments to update connector",
"priority": 1,
"condition": "user.getTaskData().getTargetConnectorType().contains(\"Oracle\") || user.getTaskData().getSourceConnectorType().contains(\"Oracle\")",
"actions": [
"user.setRuleDetail([\"impacted_feature\":\"Task using Oracle DB\", \"desc\": \"Updated comments to update connector\", \"impact\":\"low\", \"count\":\"Using \"+user.getTaskDetail().getConnBucketData().get(\"Oracle\")+\" connector type\",\"id\":1, \"extra_detail\":\"{\\\"impacted_connectors\\\":[\\\"Oracle\\\"]}\"]);"
]
}
]
Run Code Online (Sandbox Code Playgroud)
这里可能有以下两件事
-> 使用规则name,description内部操作?
...
[
{
"id": 1,
"name": "Task using Oracle DB",
"description": "Updated comments to update connector",
"priority": 1,
"condition": "user.getTaskData().getTargetConnectorType().contains(\"Oracle\") || …Run Code Online (Sandbox Code Playgroud) 我有一个要求,它需要对java值对象进行大量验证并生成结果.(我们不能使用我们公司的任何规则引擎应用程序,许多手续和许多问题需要回答).因此,我建议实现一个简单和可扩展的小规则引擎,而不是像在java代码中那样实现规则.要遵循哪种设计模式?
我在下面添加了一个粗略的xml结构,定义了规则.
<rule-set>
<name>Example1</name>
<description>Example rules defined</description>
<beans>
<bean class="com.example.Customer" alias="cust"/>
<bean class="com.example.Account" alias="acnt"/>
<bean class="com.example.Transaction" alias="trans"/>
</beans>
<rule name="CustomerInfo" description="This rule validates if all the customer values are present">
<if lhs="cust.getFirstName" rhs="null" operator="!="/>
<if lhs="cust.getLastName" rhs="null" operator="!=" logicaloperator="&&"/>
<if lhs="cust.getCountry" rhs="null" operator="!=" logicaloperator="||"/>
<if lhs="cust.getCity" rhs="null" operator="!=" logicaloperator="&&"/>
<if lhs="cust.getPhone" rhs="null" operator="!=" logicaloperator="&&"/>
<if lhs="cust.getEmail" rhs="null" operator="!=" logicaloperator="&&"/>
<then do="cust.completeFlag" arg1="true"/>
</rule>
<rule name="Transaction" description="Transfer the money from one ac to another">
<if lhs="trans.fromAccount" operator="!=" rhs="null"/>
<if lhs="trans.toAccount" operator="!=" …Run Code Online (Sandbox Code Playgroud) 场景:最终用户希望定义对系统内发生的一组数据更改事件的操作.这些操作应该是可配置的.我对此有几点疑问:
我的第一个问题是我们如何监控数据更改并从数据库层提升事件?因为没有单点输入数据库.我所知道的可能的解决方案是DB触发器,更改跟踪和更改数据捕获.它们真的是很好的选择,因为它们都是基于Pull模型的吗?
谁应该观察这些事件?我们应该将它们排成一张桌子并从那里逐一挑选吗?
它是复杂事件处理的正确用例吗?
很明显,动作的可配置性可以直接来自任何规则引擎,如drools,flexrule等.这是正确的方法吗?有很多博客都在谈论规则引擎不好选择.
我的.NET应用程序在运行时评估用户定义的规则.这些规则由用户通过GUI菜单输入系统.我生成一个与之对应的逻辑语句并将其存储在数据库中.
例如:( Name ='John'AND Surname ='Smith')或Number> 12
然而,当用户想要通过GUI编辑规则时,我需要进行反向操作以从存储的规则确定菜单状态,这是昂贵且复杂的.您如何建议以一种可以轻松转换为菜单状态的方式存储规则?
这更像是一个普遍的问题.但我试图理解使用工具的概念以及为什么需要这个工具.我一直在四处走动.
q)为什么我们需要规则引擎?
我一直在阅读Drools和ILOG规则引擎,我仍然不清楚组织使用这些工具可以获得什么好处的概念.
q)是否只是为业务用户提供了一种向数据库(存储库)发出查询(被称为规则)的方法?
与获得的收益相比,这个额外的s/w是否只会花费更多的资金用于许可证和支持?
我们总是让所有的应用程序做同样的事情.
示例:如果销售额<$ 5000000,则订单出货=否
以上是业务逻辑的示例.这很容易在程序中实现.那么通过规则引擎获得的好处是什么?
任何输入都会很棒!谢谢.
当我将项目移动到java7时,Drools在init进程中开始抛出RuntimeDroolsException异常.当我进一步挖掘时,我发现当它验证java方言时会发生这种情况.
问题是:Drools 5.1.1将"java.version"系统属性与LANGUAGE_LEVELS进行比较以验证它.LANGUAGE_LEVELS是直到1.6的java版本的硬编码列表
In org.drools.rule.builder.dialect.java.JavaDialectConfiguration,
public static final String[] LANGUAGE_LEVELS = new String[]{"1.5", "1.6"};
Run Code Online (Sandbox Code Playgroud)
我不想改变源代码.所以我添加了以下作为绕过java方言验证的解决方法.
Properties properties = new Properties();
properties.setProperty( "drools.dialect.java.compiler.lnglevel","1.6" );
PackageBuilderConfiguration cfg =
new PackageBuilderConfiguration( properties );
KnowledgeBuilder knowledgeBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(cfg);
Run Code Online (Sandbox Code Playgroud)
除了编辑源代码之外,还有更好的方法吗?
PS:Drools 5.1.1是drools的最新生产版本
我正在与之合作的公司正在寻求为他们的电子商务商店实施灵活且可扩展的促销/折扣引擎.促销和折扣的要求变化非常频繁,企业无法预测他们将在未来3个月内推出什么样的想法和促销活动,更不用说3年了.
我想确保他们构建一个灵活的促销评估引擎,可以将购物车中的商品,用户个人资料信息,以及根据日期时间,他们输入的促销代码,他们的个人资料,应用各种规则,他们购物车中的物品,他们来自的http背景等.
我们可以使用任何第三方开源或商业图书馆吗?我们只需要一个评估引擎,而不是一个持久性引擎,因为电子商务网站在Windows Azure的云端运行,而存储在Azure存储中,很少有库兼容.因此,任何基于SQL的解决方案都不起作用.
我正在开发一个接受100k +唯一输入的应用程序 - 为简单起见假设每个输入都是浮点值(a,b,c ......等) - 尽管它们也可以是字符串等.应用程序有很多规则/与这些输入相关的事件/触发器.
例1:
Rule[(a > b) and (c <= d)] --> [execute EventX]
Run Code Online (Sandbox Code Playgroud)
定义1:上述规则说:当输入'a'的值大于'b'的值并且输入'c'的值小于或等于'd'的值时,执行EventX
例2:
Rule[x != x.prev] --> [execute EventZ]
Run Code Online (Sandbox Code Playgroud)
定义2:上述规则说:如果值更新后,如果输入'x'的当前值不等于其先前值(值已更改).执行EventZ
我发现,随着输入数量的增加,以及规则数量的增加,评估"特定"规则并确定是否应该触发事件所需的总计算量正在失控 - 投掷该问题的速度越来越快,而且没有按预期进行扩展.
目前,在每次新的输入更新时,相关的输入/变量在哈希表中查找,该哈希表将变量映射到包含它的规则.随后评估每个规则,如果结果为真或可操作,则异步触发相关事件.
这个问题出现在复杂事件处理领域,遗憾的是,这个领域中的大多数架构使用了上面描述的相同的死角方法 - 可能还有一些与评估/重新评估事物的频率有关的改进.我们的想法是拥有一个能够近乎实时地做出反应的系统.在多个节点上分配规则和输入似乎也不能很好地工作,因为在某些情况下,超过95%的活动规则中存在少数输入.
我希望是否有任何其他SO'ers,知道更好的方法来解决这个问题,数据/结构或算法.
我想到的一个简单的想法是,可以构建一个依赖逻辑推理的列表.
如果有两个规则是这样的:
Rule[a < b] --> [exec E1]
Rule[b >= a] --> [exec E2]
Run Code Online (Sandbox Code Playgroud)
然后对'a'或'b'的更新不应该要求对两者等进行评估,但我发现构建这样的逻辑推理结构非常复杂且容易出错,并且难以完全和严格地测试.
输入可以代表股票价格,温度传感器等.
还要注意,一些输入在时间上受到限制,这意味着规则可能要求变量的状态在特定位置/状态下持续一段时间(例如:MSFT的价格>最后30秒的20美元),目前,这是通过使用值为0或1/false或true的'代表变量'(facade)来实现的(变量的值由单独的机制决定,这通常是规则被触发的结果).
还应该注意的是,由于近实时约束和每秒产生的数据量,使用具有触发器和存储过程的DB的选项是不可能的.
c++ algorithm rule-engine complex-event-processing data-structures
我已经阅读了很多关于JBoss Drools的文档但是找不到关于是否所有规则同时执行的肯定答案(当然它们是同时被触发的).更具体地,对于单个输入和1000个规则的规则集,在每个规则中执行"何时"条件和"然后"条件,逐个顺序执行,或者同时并行执行.
一方面,当选择节点被折叠时,rete算法意味着并行性.然而,节点优化后评估顺序?beta内存和连接节点看起来应该同时执行,但它们是什么?
此外,Drools文档提到"顺序模式",默认情况下这是关闭的.什么是开启,并行模式?并且有一个maxThreads选项暗示线程.
另一方面,我被告知代码不使用线程,因此同时进行评估,但大部分顺序执行.
有没有人见过任何证明这种情况的文件?
谢谢!
只是想到有没有办法使用Drools API将drl文件转换为excel表?
我们目前在Drools 5.3但是真的可以使用任何版本.
提前致谢
rule-engine ×10
drools ×4
java ×4
.net ×2
algorithm ×1
c++ ×1
concurrency ×1
easy-rules ×1
groovy ×1
java-7 ×1
rete ×1
rule ×1
sql ×1