Drools 将新对象插入到无状态KnowledgeSession

Drools 将新对象插入到无状态KnowledgeSession,drools,rule-engine,Drools,Rule Engine,我有一个简单的规则如下: rule "First Rule" //You do not talk about Fight Club when MyInp(id=="1") then insert(new MyOut(true)); end 我想要的是,从Java类获取创建的MyOut对象。 有没有办法做到这一点,或者我必须传递一个全局变量并在规则中更新它?通过无状态会话,您可以修改插入的事实,或者注册一个更新的全局变量 如果您有一个有状态会话,那么还有几个选项: 如果您正在寻

我有一个简单的规则如下:

rule "First Rule" //You do not talk about Fight Club
when
    MyInp(id=="1")
then
    insert(new MyOut(true));
end
我想要的是,从Java类获取创建的MyOut对象。
有没有办法做到这一点,或者我必须传递一个全局变量并在规则中更新它?

通过无状态会话,您可以修改插入的事实,或者注册一个更新的全局变量

如果您有一个有状态会话,那么还有几个选项:

如果您正在寻找一种在无状态会话期间检查工作内存中存在哪些内容的通用方法

StatelessKnowledgeSession ksession = 
        kbase.newStatelessKnowledgeSession();
TrackingWorkingMemoryEventListener listener = 
        new TrackingWorkingMemoryEventListener();
ksession.addEventListener(listener);

List<Object> facts = new ArrayList<Object>();
facts.add(myRequestFact);

ksession.execute(facts);

List<ObjectInsertedEvent> insertions = listener.getInsertions();
无状态知识会话ksession=
kbase.newStatelessKnowledgeSession();
TrackingWorkingMemoryEventListener侦听器=
新的TrackingWorkingMemoryEventListener();
ksession.addEventListener(侦听器);
列表事实=新的ArrayList();
事实。添加(myRequestFact);
执行(事实);
List insertions=listener.getInsertions();
它对于调试和审计来说很方便,但我不建议将其作为从请求中获得实际结果的一种手段。跟踪工作记忆EventListener的示例代码(由我编写)可在此处找到:


谢谢@Steve。如果我理解正确,我无法从无状态会话中获取新对象,对吗?不。。。您只需运行execute()方法,该方法封装创建一个有状态(!)会话,插入事实,然后终止该会话。因此,在运行之后,您无法查询会话中的事实。不过,我会在WorkingMemoryEventListener上添加一个简短的注释,因为这可以用来实现这个目标。我也不喜欢EventListener方法。因此,我将在会话之前插入一个空消息/输出对象,并在会话之后检索它。我认为这是最好的方法-插入一个MyRequest/MyResult对。