流口水外化条件

Drools externalize condition

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

例如在下面的规则中,“2008”的支票将存储在数据库中

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

我找到了一种方法,可以从 database/inmemory 缓存实现中获取此值 2008 并按如下方式更改它。这将允许我的 operations/business 更改这些值而无需在 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%")

这样它将帮助我在 database/cache 的值发生变化时自动注入值。

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

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

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

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

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