当前位置: 首页 > 知识库问答 >
问题:

Drools:使用查询获取无状态会话结果

艾阳羽
2023-03-14

由于它来自官方的Drools文档,因此可以使用查询从无状态会话中获取结果。

// Set up a list of commands
List cmds = new ArrayList();
cmds.add( CommandFactory.newSetGlobal( "list1", new ArrayList(), true ) );
cmds.add( CommandFactory.newInsert( new Person( "jon", 102 ), "person" ) );
cmds.add( CommandFactory.newQuery( "Get People" "getPeople" );

// Execute the list
ExecutionResults results =
  ksession.execute( CommandFactory.newBatchExecution( cmds ) );

// Retrieve the ArrayList
results.getValue( "list1" );
// Retrieve the inserted Person fact
results.getValue( "person" );
// Retrieve the query as a QueryResults instance.
results.getValue( "Get People" );

在下面的示例中,Get People是一个drools查询,它基本上返回一个对象或一个无状态的对象列表(!)一场

在我的项目中,我需要获取在无状态Kie会话中创建的对象,因此我创建了一个查询:

query "getCustomerProfileResponse"
    $result: CustomerProfileResponse()
end

CustomerProfileResponse对象正在RHS中构造和创建:

insert(customerProfileResponse);

我编写了以下代码来在批处理模式下执行命令,并查询得到的CustomerProfileResponse:

// Creating a batch list
List<Command<?>> commands = new ArrayList<Command<?>>(10);
commands.add(CommandFactory.newInsert(customerProfile));
commands.add(CommandFactory.newQuery(GET_CUSTOMER_PROFILE_RESPONSE, 
GET_CUSTOMER_PROFILE_RESPONSE));

// GO!
ExecutionResults results = kSession.execute(CommandFactory.newBatchExecution(commands));

FlatQueryResults queryResults = (FlatQueryResults) results.getValue(GET_CUSTOMER_PROFILE_RESPONSE); // size() is 0!

但是queryResults返回一个空列表。

我在堆栈溢出中搜索类似的问题,发现无法使用批处理模式对Drools中的无状态会话运行查询,因为会话在调用execute()方法后立即关闭,解决方案是在请求中注入空的CustomerProfileResponse对象以及CustomerProfile

有人能解释一下这个问题吗?

共有1个答案

劳灵均
2023-03-14

正在添加CommandFactory。newInsert之后和NewQuery之前的newFireAllRules()应该可以解决这个问题。看见http://drools-moved.46999.n3.nabble.com/rules-users-Query-in-stateless-knowledge-session-returns-no-results-td3210735.html

在执行所有命令之前,您的规则不会触发。i、 e.隐式fireAllRules()是所有命令执行完毕后。这意味着将在规则触发以插入对象之前调用查询相反,您需要在执行查询之前添加FireAllRules命令。

 类似资料:
  • 需要一些帮助!!我对Drools中的有状态和无状态会话没有清晰的理解。我正在努力理解这一点,所以尝试了一个例子。 我在drools6.5版本上使用有状态和无状态会话测试了下面的drl,在这两种情况下都得到了相同的输出。根据我对无状态会话的理解,它应该只执行第一条规则,当应用程序对象在第一条规则中被修改时,第二条规则不应该被激活(“有效期”)。附加源代码。感谢您在这方面的帮助。

  • 我对口水还不熟悉。我试图理解Drools提供的无状态会话和有状态会话之间的区别。 根据我的初步理解, 在无状态会话的情况下,如果在任何规则的操作执行过程中修改了事实,则不会将其重新提交给推理引擎以找出与修改后的事实匹配的新规则。 在状态会话的情况下,如果在任何规则的操作执行过程中修改了事实,则它将被重新提交给推理引擎以找出与修改后的事实相匹配的新规则,然后执行相应的操作。 因此,当我试图通过编写一

  • null null 如果进入房间的人是教师,则输入打印教师。 如果进入房间的人数超过30人,请通知我。 如果学生已上了超过20个小时的课,则更新状态为已完成。 现在我想要1和3组合在一起。 类似:4。如果有属性状态完成的学生进入教室,请通知老师。 现在,正如我前面所说的,这两个事件是分开的。所以在两个不同的规则中处理它更容易。但是当我想创建一个规则,它是规则4中1和3的组合,那么我必须验证一个进入

  • 如何为drools无状态会话设置全局变量。 假设两个线程访问同一个会话,但为每个线程设置一个全局变量customer arraylist和新的arraylist。对于全局变量customer,第二个线程的arraylist是否替换第一个线程的arraylist。 这似乎是Stateless知识库类留档的情况: 无状态KnowledgeSessions支持全局,其作用域有多种方式。我将首先介绍非命令

  • 我正在创建一个Drools有状态会话,如JBPM持久性文档中所述:http://docs.jboss.org/jbpm/v5.1/javadocs/org/drools/persistence/jpa/JPAKnowledgeService.html 但是,我遇到了以下异常 我的代码是: 在最后一行引发异常。在此之前,我已经绑定了上述文档中描述的JDBC JTA数据源。 我在MySQL JDBC驱

  • 问题内容: 有状态会话Bean定义如下: 有状态会话Bean对象的状态由其实例变量的值组成。在有状态会话Bean中,实例变量代表唯一的客户端Bean会话的状态。因为客户端与其bean进行交互(“交谈”),所以这种状态通常称为对话状态。 无状态会话Bean定义如下: 无状态会话Bean无状态会话Bean不会与客户端保持对话状态。当客户端调用无状态Bean的方法时,该Bean的实例变量可能包含特定于该