[rules-users] Stateless session commands and ExecutionResults (5.5.0.Final)

Stephen Masters stephen.masters at me.com
Wed Dec 11 05:38:15 EST 2013


Thanks for that, Wolfgang. I have been working on something else for a few days, but just switched over to batch execution, and that is giving me some appropriate results (my tests are passing).

Which leads me to the question ...

Given that Example 3.4.1 in the Drools 5.5.0.Final user guide does not compile, is that because there is a bug in the implementation of command execution? Or is it a bug in the example. i.e.
The results should just not be assigned to anything?
The results (an ArrayList containing the facts which were just inserted) should be assigned to a List of Object?
The example should just be removed from the user guide, as it is no longer a valid/recommended approach?

Anybody with thoughts on that? Assuming that the answer is a documentation fix, I’ll be happy to correct it appropriately and submit a pull request.

Cheers,

Steve

 


On 4 Dec 2013, at 12:24, Wolfgang Laun <wolfgang.laun at gmail.com> wrote:

> I think you have to put your insert command into a list
>  List<Command<?>> cmds = new ArrayList();
> and pass this via batch execution
>  CommandFactory.newBatchExecution( cmds )
> 
> -W
> 
> On 04/12/2013, Stephen Masters <stephen.masters at me.com> wrote:
>> Hi folks,
>> 
>> Can anyone explain how stateless session execution results should work?
>> Working through the docs and tracing the code, it’s getting a bit
>> confusing.
>> 
>> Firstly, according to the user manual, one should be able to insert a list
>> of facts as a Command, and get an instance of ExecutionResults back, which
>> can then be queried. Here’s the example code:
>> StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession();
>> 
>> Command cmd = CommandFactory.newInsertElements( Arrays.asList( Object[] {
>> 
>>                  new Cheese( "stilton" ),
>> 
>>                  new Cheese( "brie" ),
>> 
>>                  new Cheese( "cheddar" ),
>> 
>>              });
>> 
>> ExecutionResults bresults = ksession.execute( cmd );
>> 
>> That doesn’t compile, so I fixed it as follows:
>> 
>>        Command cmd = CommandFactory.newInsertElements( Arrays.asList(
>>                new Cheese( "stilton" ),
>>                new Cheese( "brie" ),
>>                new Cheese( "cheddar" )
>>         ));
>>        ExecutionResults bresults = ksession.execute( cmd );
>> 
>> This does now compile, but running it throws a ClassCastException:
>> 	java.lang.ClassCastException: java.util.ArrayList cannot be cast to
>> org.drools.runtime.ExecutionResults
>> 
>> Taking a look through the Drools code, it would appear that Command has a
>> generic type, which in the case of an InsertElementsCommand is:
>> GenericCommand<Collection<FactHandle>>
>> 
>> In turn, the execute command in StatelessKnowledgeSessionImpl casts its
>> result to that generic type:
>> 	public <T> T execute(Command<T> command) {
>> 		Object o = ((GenericCommand) command).execute( context );
>> 		...
>> 		return (T) o;
>> 
>> So the ClassCastException is because the execute method returns an ArrayList
>> of FactHandle instead of an ExecutionResults.
>> 
>> I’m assuming that I must have got the wrong end of the stick somewhere, so
>> what should I be doing to get an ExecutionResults from a stateless session,
>> which I can then query?
>> 
>> Cheers,
>> 
>> Steve
> 
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20131211/47ef3dee/attachment-0001.html 


More information about the rules-users mailing list