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

Wolfgang Laun wolfgang.laun at gmail.com
Wed Dec 4 07:24:15 EST 2013


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



More information about the rules-users mailing list