在drools规则中使用匹配中的全局变量

时间:2014-12-09 10:30:27

标签: drools

我将此规则设置为drools。

global String ipv4regex;

rule "Initialize global"
  salience 1000
when        
then
   drools.getWorkingMemory().setGlobal( "ipv4regex", "\\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b");
end

rule "Router"
when
    r : Router( Ipaddress matches ipv4regex)
then
    System.out.println("Valid ip address");
end

这里我正在检查有效的IP地址,但即使我的路由器IP地址有效,我的规则“路由器”也没有显示“有效的IP地址”。这里可能存在什么问题以及如何在匹配中使用全局变量?

1 个答案:

答案 0 :(得分:3)

全局变量的设置发生得太晚了。您必须在插入任何事实之前执行此操作。

这是由于全局变量未被规则引擎监控 - 与事实相反,其中(通过修改或更新公布)更改被重新考虑,从而导致重新评估。

  • 在Java代码中预先设置全局。
  • 在Java类中使用静态final visible
  • 使用包含带有regec的字符串的另一个事实。
  • 使用正则表达式的字符串文字。

<强>后来

您可以在DRL中为此目的声明一个事实类型:

declare Const
   pattern: String
end

rule initConst
salience 1000
when
then
    insert( new Const( "\\b(25[0-5]|2..." ) );
end

rule "Router"
when
    Const( $pat: pattern )
    r : Router( Ipaddress matches $pat )
then
    System.out.println("Valid ip address");
end