Drools:使用在会话创建时为新插入的规则定义的全局变量

时间:2011-02-07 13:07:09

标签: java drools

是的,我在正在制作的订购计划中运行Drools。我被要求通过JMX在程序运行期间制定可加载的规则。我将它们作为String接受并将它们添加到StatefulKnowledgeSession的知识库中。到目前为止一切都很好。我得到一个简单的测试规则来加载就好并且没有事故。

然而,当我启动程序时,我加载了许多固定的全局变量,例如Logger。如果我尝试通过JMX加载引用这些全局变量的规则,那么就说 com/hipdm/messaging/Rule_Test_0.java (7:704) : logger cannot be resolved
有没有办法让这个全局对新加载的规则可见?我已将其输入到与启动时加载的规则相同的包中 完整规则:

package com.hipdm.messaging  

import com.hipdm.messaging.model.DummyOrderMessage  

rule "Test"  
   when $msg : DummyOrderMessage( processed == false ) from entry-point "Message stream"  
then  
   modify($msg) {process()};  
   logger.info("Order processed by rule engine");  
end

任何想法可能是错的,以及如何在创建初始会话后使我的全局变量可见?

1 个答案:

答案 0 :(得分:1)

据我所知,全局变量必须'导入'到规则文件才能使它们可见。 DRL中存在一个特殊关键字:全局。为此,请在规则中的导入行之后添加以下行。

global <full-class-name> <name-of-global-variable>

因此,如果您使用的是记录器(假设它是log4j-logger),您可以添加:

global org.apache.log4j.Logger logger

当然在Java代码的另一端,全局必须设置为工作内存,但我想你设法做到了。在任何情况下:

workingMemory.setGlobal("logger", someLogger);

请注意,'logger'关键字在Java代码和规则中必须完全相同。