[rules-users] how to update object modified by call to remote web service

Wolfgang Laun wolfgang.laun at gmail.com
Thu Jul 28 01:37:38 EDT 2011


On 27 July 2011 23:27, lhorton <LHorton at abclegal.com> wrote:

> We are at 5.2.0 Final
>
> The rule must now capture the
> return from the call to the remote service, in order to see the changes
> made by the remote service call.
>
> Within the rule, this change is working fine.  The RHS was:
>
>      applicationService.applyInstruction($step);
>
> as above, the $step fact would not be updated within the rule WM now that
> the service is called remotely.  However, when I changed this to
>
>      $step = applicationService.applyInstruction($step);
>

This just changes a local (binding) variable; it does not change the object
the reference of which is availabe via the variable. (As in Java.)


>
> then $step did have the changes(I am verifying this by writing debug info
> to
> the log).  BUT, the object that was passed in to execute() on the knowledge
> session did NOT have the changes.  I have tried several things to fix this.
> one was to update($step) but this failed with "Update error: handle not
> found for object,"


The result of the RMI is an entirely new object, which you can't update.



> I assume because the fact handle changed in the object
> returned from the service call.
>
> I also tried some variations on retracting and inserting the step:
>
>        retract($step);
>        $step = applicationService.applyInstruction($step);
>        insert($step);
>
>
The out-identifier of the "insert" command is bound to the fact handle
resulting from the original insert, so you can't get another object via this
identifier.


> and also tried using a different variable name:
>
>        retract($step);
>        $step2 = applicationService.applyInstruction($step);
>        insert($step2);
>        update($step2);
>
> both these above did not get errors, but also did not cause the updated
> object to return from session.execute() call.
>

Same thing.


>
> To summarize:
> in a call to execute() on a stateless knowledge session, an object is
> passed
> in
> a rule fires that calls a remote service that modifies the object
> within the rule, we catch the changed object that is returned from the
> service call
> within the rule, the changes to the object ARE visible
> on the return from execute(), the changes are NOT visible
>
>
You have several options.

1. Insert a second object Box { Step step;... } with an out-identifier and
do
       retract($step);
       $step = applicationService.applyInstruction($step);
       insert($step);
       modify( $box ){ setStep( $step ) }
With multiple Step objects being around, you'll have to use as many Boxes
and associate them with the original Step object as a second field.

2. Store the new $step into a global Box and use the getGlobal command.

3. Use the getObjects command, possibly with a filter to get only Step
objects.

-W



> thanks for your help...
>
>
> --
> View this message in context:
> http://drools.46999.n3.nabble.com/how-to-update-object-modified-by-call-to-remote-web-service-tp3204887p3204887.html
> Sent from the Drools: User forum mailing list archive at Nabble.com.
> _______________________________________________
> 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/20110728/068c024c/attachment.html 


More information about the rules-users mailing list