Drools外化条件

时间:2016-04-19 01:50:23

标签: drools kie-server java-annotations

在我的组织中,我们决定使用KieServer来运行drools。我们没有使用kieworkbench,这是因为我们需要对部署进行更多控制,并且应该与相关应用程序保持一致。要求是外部化条件检查。

例如在下面的规则中,“2008”的检​​查将存储在数据库

when 
    $customer:Customer(membersince <= "2008")
then
    $customer.setOfferPercent("50%")

我已经想出了一种从数据库/内存缓存实现中获取此值的方法,并将其更改如下。这将允许我的操作/业务更改此类值而无需在kie服务器中进行部署并减少大量工作

when 
    $customer:Customer(membersince <= cache.get("Member_Since_Elite"))
then
    $customer.setOfferPercent("50%")

我的问题是,有没有其他方法可以声明为全局,并在数据库中更改时自动填充值。我希望通过使用注释来做类似下面的事情,并需要一些帮助。

declare Properties
    member_since_elite : String @Property("member_since_elite")
end
when 
    $customer:Customer(membersince <= Properties.member_since_elite )
then
    $customer.setOfferPercent("50%")

这样,它可以帮助我在数值更改时自动从数据库/缓存中注入值。

1 个答案:

答案 0 :(得分:1)

您可以创建一个(或多个)类,仅用于保存参数,例如,使用memberSinceElite等字段限制。然后你可以制定规则

when
    Limit( $mse: memberSinceElite )
    $c: Customer( membersince <= $mse, offerPercent != 50 )
then
    modify( $customer ){ setOfferPercent( 50 ) }

这允许在正在进行的会话期间进行动态更新。如果可以自动填充Java对象,则可以在启动会话之前插入Limit对象。更新取决于您如何将数据库更新与会话相关联。

如果您不需要,可以使用全局。确保在插入任何事实之前将其设置为 。它会持续到会议。像以前一样自动填充。

(您还可以使用模板将值插入DRL代码。这需要重新生成和编译才能生效。)