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

Wolfgang Laun wolfgang.laun at gmail.com
Fri Aug 5 01:25:08 EDT 2011


There are two distinct ways of passing parameters: call by
value<http://de.wikipedia.org/wiki/Wertparameter>and call
by reference <http://de.wikipedia.org/wiki/Referenzparameter>. Passing Java
objects blurs this distinction: the reference to the object is passed by
value, but the called method can modify the referred object arbitrarily. The
called method can *not* change the reference itself, i.e., the object
remains the same.

But what happens during a RMI? The stub on the client's side behaves as you
expect. But then the passed object is serialized, the data (not the object)
is sent away, and, eventually, some data comes back and is deserialized into
*another object. *And so this is, ultimately, a call by value, copying in to
and out from the remotely called method.

Each setJobName RMI creates a clone of Step - so at the end of this little
session you have 4 Step objects, the originals (still around as unchanged
facts) and the clones in your "results" list.

-W


Method
   Step rmiService.setJobName( Step step,...)
could preserve object identity by copying all attributes of the deserialized
object into the "in" object.

(Alternatively, the service could pass the entire object hierarchy to
maintain integrity, but with parent and children being facts this would
complicate matters considerably.)



On 5 August 2011 01:46, lhorton <LHorton at abclegal.com> wrote:

> I now have a more complex problem to solve involving this RMI issue and
> would
> like some advice.  I will state this as a simplified example to help
> explain
> the problem.
>
> Assume an object hierarchy:
>
> there is a Job, which has two attributes, a name and a list of Step
> objects.
> Each Step also has a name.
>
> before rules execute, create an instance of Job with no name.
> Add two Steps to the Job's step list:  one step is named "one" and the
> other
> is named "two"
>
> the knowledge session has a global named "rmiService" that is a remote
> application service.
> knowledge session also has a global named "results" that is a List (this is
> my Box)
>
> there are two rules:
>
> rule1
> when
>  $step : Step(name="one")
> then
>   $step = rmiService.setJobName($step, "i belong to step one"); // sets the
> name of the step's job
>   results.add($step);
> end
>
> rule2
> when
>  $step : Step(name="two")
> then
>   $step = rmiService.setJobName($step, "i belong to step two");
>   results.add($step);
> end
>
> call execute() on the session, passing in the Step objects.
>
> assume that both rules fire.  after execution, the results global contains
> two objects: the step named "one" has a parent job with name "I belong to
> step one" and step named "two" has a parent job with name "i belong to step
> two" - in other words, they no longer have the same parent Job.
>
> I can't figure out how I can keep a hierarchy of objects updated when there
> are multiple RMI calls in the same session.
>
>
>
>
>
> --
> View this message in context:
> http://drools.46999.n3.nabble.com/how-to-update-object-modified-by-call-to-remote-web-service-tp3204887p3227109.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/20110805/62654659/attachment.html 


More information about the rules-users mailing list