Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Drools:使用会话创建时为新插入的规则定义的全局变量_Java_Drools - Fatal编程技术网

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

Java Drools:使用会话创建时为新插入的规则定义的全局变量,java,drools,Java,Drools,对,我正在做一个订购程序。我被要求在程序运行期间通过JMX加载规则。我将它们作为字符串输入,并将它们添加到StatefulKnowledgeSession的知识库中。到目前为止一切顺利。我得到了一个简单的测试规则,可以很好地加载,而且不会发生意外 但是,当我启动程序时,我会加载一些固定的全局变量,例如记录器。如果我试图通过JMX加载引用这些全局变量的规则,它会显示 com/hipdm/messaging/Rule\u Test\u 0.java(7:704):无法解析记录器 有没有办法使新加载的

对,我正在做一个订购程序。我被要求在程序运行期间通过JMX加载规则。我将它们作为字符串输入,并将它们添加到StatefulKnowledgeSession的知识库中。到目前为止一切顺利。我得到了一个简单的测试规则,可以很好地加载,而且不会发生意外

但是,当我启动程序时,我会加载一些固定的全局变量,例如记录器。如果我试图通过JMX加载引用这些全局变量的规则,它会显示
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>