是的,我在正在制作的订购计划中运行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
任何想法可能是错的,以及如何在创建初始会话后使我的全局变量可见?
答案 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代码和规则中必须完全相同。