1

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

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

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

我想出了一种从数据库/内存缓存实现中获取此值 2008 的方法,并将其更改如下。这将允许我的运营/业务无需在 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%")

这样,当它的值发生变化时,它将帮助我从数据库/缓存中自动注入值。

4

1 回答 1

2

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

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

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

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

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

于 2016-04-19T05:09:47.380 回答