如何在side drools中定义变量并为它们添加值

时间:2015-10-13 12:00:19

标签: drools

如何在DRL文件中定义变量并为其添加值,可以在规则之间将其用作静态资源。

我尝试使用全局关键字但是在添加时我添加了值,我将不会像在文档中提到的那样在工作内存中实现。在我的情况下,我不能从应用程序端添加它。

示例:

 global java.util.List myList;

function java.util.List initMyList() {
 List list = new ArrayList();
 list.add(1);
 return list;
}

rule "initListRule"
salience 1001
 when
  eval(myList == null)
then
 myList = initMyList();
end

rule "checkIfListIsStillEmptyRule"
 salience 1000
when
 eval(myList != null)
then
 System.out.println("MyList is Not null");
end

由于全局不存储在woking内存中,因此myList将始终为null,因为它不是从Application端提供的。是否可以选择定义变量并将其填入DRL?

1 个答案:

答案 0 :(得分:2)

不会动态评估DRL全局,因此您的规则“checkIfListIsStillEmptyRule”不会触发。

你可以做到

rule "initListFact"
when
    not List()
then
    insert( new ArrayList() );
end
rule "checkThatThereIsAnEmptyList"
when
    $list: List( size == 0 )
then
    modify( $list ){ add( "something" ) }
end

如果您不需要观察全局变化,可以在具有极高显着性的规则中对其进行初始化。它将作为资源提供,但您无法根据其状态建立规则条件。

global list myList
rule "initListRule"
salience 9999999999
when
then
    myList = new ArrayList();
end

您可以使用多个全局:

global List myListOne
global List myListTwo
rule "initListsRule"
salience 9999999999
when
then
    myListOne = new ArrayList();
    myListTwo = new ArrayList();
end

如果你需要对变化做出反应,那就无法解决事实。

declare NamedList
    name: String
    list: ArrayList
end
rule createListOne
when
    not NamedList( name == "one" )
then
    insert( new NamedList( "one", new ArrayList() ) );
end
rule "checkIfListOneIsStillEmpty"
when
    $nl: NamedList( name == "one", eval( list.size() == 0 ) )
then
    modify( $nl ){vgetList().add( "something" ) }
end