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
是一个droolsQuery
,它基本上返回一个对象或一个对象列表,形成一个无状态(!)会话
在我的项目中,我需要获取在无状态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”查询对象作为批处理命令插入会话,则此查询可以正确运行。实际上,我不确定这是否是一个好的解决方案。