2016-04-19 16 views
0

In meiner Organisation haben wir uns entschieden, KieServer zum Laufen Drools zu verwenden. Wir verwenden den kieworkbench nicht, da wir mehr Kontrolle über die Bereitstellung benötigen und auf die entsprechende Anwendung ausgerichtet sein sollten. Die Frage ist, die Bedingungsprüfung extern zu machen.Drools externalize Bedingung

zum Beispiel in der Regel wie unten, wird die Prüfung für „2008“ in einer Datenbank

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

ich diesen Wert 2008 einen Weg herausgefunden habe, aus der Datenbank/inmemory Cache-Implementierung und Änderung gespeichert werden, um zu erhalten es wie unten. Dies wird mein Betrieb/Unternehmen ermöglichen, in dem kie Server ohne Einsatz solche Werte zu ändern und die Bemühungen viele

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

Meine Frage ist, zu reduzieren, ist es eine andere Art und Weise als globales und Auto zu erklären, bevölkert die Werte, wenn seine in der Datenbank geändert. Ich hoffe, etwas wie unten mit Anmerkungen zu tun, und brauche Hilfe.

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

diese Weise ist es mir Auto injiziert die Werte aus der Datenbank/Cache helfen, wann immer sein Wert ändert.

Antwort

1

Sie können eine (oder mehrere) Klassen nur zum Halten von Parametern erstellen, z. B. Limit, mit Feldern wie memberSinceElite. Dann können Sie die Regel

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

formulieren Dies ermöglicht die dynamische Aktualisierung während einer laufenden Sitzung. Wenn Sie ein Java-Objekt automatisch auffüllen können, können Sie das Limit-Objekt direkt vor dem Start der Sitzung einfügen. Die Aktualisierung hängt davon ab, wie Sie ein DB-Update auf die Sitzung beziehen können.

Wenn Sie das nicht benötigen, können Sie eine globale verwenden. Stellen Sie sicher, dass Sie vor dem Einfügen von Fakten setzen. Es wird für die Sitzung dauern. Autopopulate wie zuvor.

(Sie können Templating auch verwenden, um die Werte in den DRL-Code einzufügen. Dies muss regeneriert und kompiliert werden, um wirksam zu werden.)