对,我在我正在制作的订购程序中运行 Drools。我被要求在程序运行期间通过 JMX 加载规则。我将它们作为字符串并将它们添加到 StatefulKnowledgeSession 的知识库中。到目前为止一切都很好。我得到了一个简单的测试规则,可以很好地加载并且不会发生任何事件。
但是,当我启动程序时,我加载了许多固定的全局变量,例如记录器。如果我尝试通过 JMX 加载引用这些全局变量的规则,它会显示
com/hipdm/messaging/Rule_Test_0.java (7:704):无法解析记录器
有没有办法让这个全局对新加载的规则可见?我已将其输入与启动时加载的规则相同的包中。
完整规则:
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
有什么想法可能是错误的以及如何在初始 session 创建后使我的全局变量可见吗?
最佳答案
据我所知,全局变量必须“导入”到规则文件中才能使其可见。 DRL中有一个特殊的关键字:global。为此,请在规则中的 import 行之后添加以下行。
global <full-class-name> <name-of-global-variable>
因此,如果您使用记录器(假设它是 log4j-logger),您将添加:
global org.apache.log4j.Logger logger
当然,在 Java 代码的另一端,全局必须设置为工作内存,但我猜您已经做到了。无论如何:
workingMemory.setGlobal("logger", someLogger);
请注意,Java 代码和规则中的“logger”关键字必须完全相同。
关于java - Drools:使用在 session 创建时为新插入的规则定义的全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4921651/