Java Drools:使用会话创建时为新插入的规则定义的全局变量
对,我正在做一个订购程序。我被要求在程序运行期间通过JMX加载规则。我将它们作为字符串输入,并将它们添加到StatefulKnowledgeSession的知识库中。到目前为止一切顺利。我得到了一个简单的测试规则,可以很好地加载,而且不会发生意外 但是,当我启动程序时,我会加载一些固定的全局变量,例如记录器。如果我试图通过JMX加载引用这些全局变量的规则,它会显示Java Drools:使用会话创建时为新插入的规则定义的全局变量,java,drools,Java,Drools,对,我正在做一个订购程序。我被要求在程序运行期间通过JMX加载规则。我将它们作为字符串输入,并将它们添加到StatefulKnowledgeSession的知识库中。到目前为止一切顺利。我得到了一个简单的测试规则,可以很好地加载,而且不会发生意外 但是,当我启动程序时,我会加载一些固定的全局变量,例如记录器。如果我试图通过JMX加载引用这些全局变量的规则,它会显示 com/hipdm/messaging/Rule\u Test\u 0.java(7:704):无法解析记录器 有没有办法使新加载的
com/hipdm/messaging/Rule\u Test\u 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
有什么想法可能是错误的,以及我如何在初始会话创建后使全局文件可见吗?据我所知,全局文件必须“导入”到规则文件中以使其可见。DRL中存在一个特殊的关键字:global。要执行此操作,请在规则中的导入行之后添加以下行
global <full-class-name> <name-of-global-variable>
当然,在Java代码的另一端,必须将全局设置为工作内存,但我想您已经做到了。无论如何:
workingMemory.setGlobal("logger", someLogger);
请注意,“logger”关键字在Java代码和规则中必须完全相同。谢谢,这确实很有帮助。奇怪的是,其他启动规则是如何相互继承的。啊,好吧,解决方案确实是通过全局关键字导入它。是的,我想包的东西可以让你做一些欺骗,所以你不需要在每个规则文件中都使用导入语句。不过我并不喜欢这样,我更喜欢清楚地说明导入,而不是在包文件中引入额外的配置层。(我想这就是你的意思,对吗?)
global <full-class-name> <name-of-global-variable>