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

Java Drools:使用查询获取无状态会话结果,java,drools,stateless,Java,Drools,Stateless,由于它来自官方的Drools,因此可以使用Query从无状态会话获取结果 // 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

由于它来自官方的
Drools
,因此可以使用
Query
从无状态会话获取结果

// 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
Query
,它基本上返回一个对象或一个对象列表,形成一个无状态(!)会话

在我的项目中,我需要获取在无状态
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!
//创建批处理列表
列表>(10);
add(CommandFactory.newInsert(customerProfile));
commands.add(CommandFactory.newQuery)(获取客户配置文件),
获取_客户_配置文件_响应));
//走!
ExecutionResults=kSession.execute(CommandFactory.newBatchExecution(commands));
FlatQueryResults queryResults=(FlatQueryResults)results.getValue(获取客户配置文件响应);//size()是0!
但是
queryResults
返回一个空列表

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


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

在newInsert之后和NewQuery之前添加CommandFactory.newFireAllRules()应该可以解决这个问题。看

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

相反,您需要在执行查询之前添加FireAllRules命令


在newInsert之后和NewQuery之前添加CommandFactory.newFireAllRules()可以解决此问题。看

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

相反,您需要在执行查询之前添加FireAllRules命令


经过一些研究之后,我还发现,如果在实际规则执行之前,将“dummy”或“plain”查询对象作为批处理命令插入会话,则此查询可以正确运行。实际上,我不确定这是否是一个好的解决方案。经过一些研究之后,我还发现,如果在实际规则执行之前,将“dummy”或“plain”查询对象作为批处理命令插入会话,则此查询可以正确运行。实际上,我不确定这是否是一个好的解决方案。