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

标签 java drools

对,我在我正在制作的订购程序中运行 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/

相关文章:

Java 泛型比较器

java - 创建新对象时 ArrayIndexOutOfBounds?

java - Optaplanner:评估解决方案

java - Optaplanner 列出规划变量

java - 如何在 jboss drools 中定义常量?

java - 我可以创建一个从另一个规则文件导入规则的规则文件吗?

java - 使用 Sybase DB 迁移 JBPM 7.31.0 时出现问题,未找到其余 API

Java Swing 可滚动框架

java - 如何在不安装jdk或jre的情况下在任何计算机上单击.exe而不是jar文件来运行java应用程序

java - 在*多线程* Swing 应用程序中使用 Hibernate 进行 session 管理