<br><font size=2 face="sans-serif">Kris,</font>
<br>
<br><font size=2 face="sans-serif">Some more information: the NullPointerException
from GetObjectCommand is thrown by the line:</font>
<br>
<br><tt><font size=2> ((StatefulKnowledgeSessionImpl)ksession).session.getExecutionResult().getResults().put(
this.outIdentifier,<br>
object );<br>
</font></tt><font size=2 face="sans-serif"><br>
Method getExecutionResult() is returning null. Debugging my test case,
I also notice that this.outIdentifier is also null.</font>
<br>
<br><font size=2 face="sans-serif">I then had a look at the GetObjectsCommand
class; in its execute method, there is a line similar to that above. However,
it is contained within an if block that checks this.outIdentifier is not
null:</font>
<br>
<br><tt><font size=2> if ( this.outIdentifier
!= null ) {<br>
List objects = new ArrayList(
col );<br>
<br>
((StatefulKnowledgeSessionImpl)ksession).session.getExecutionResult().getResults().put(
this.outIdentifier, objects );<br>
}<br>
</font></tt>
<br><font size=2 face="sans-serif">If something similar was done in GetObjectCommand,
presumably this would fix my problem?</font>
<br>
<br><font size=2 face="sans-serif">Hope this is of some use - regards,</font>
<br>
<br><font size=2 face="sans-serif">Alan</font>
<p>
<br>
<br>
<br>
<table width=100%>
<tr valign=top>
<td width=40%><font size=1 face="sans-serif"><b>Alan.Gairey@tessella.com</b>
</font>
<br><font size=1 face="sans-serif">Sent by: rules-users-bounces@lists.jboss.org</font>
<p><font size=1 face="sans-serif">29/10/2009 17:35</font>
<table border>
<tr valign=top>
<td bgcolor=white>
<div align=center><font size=1 face="sans-serif">Please respond to<br>
Rules Users List <rules-users@lists.jboss.org></font></div></table>
<br>
<td width=59%>
<table width=100%>
<tr valign=top>
<td>
<div align=right><font size=1 face="sans-serif">To</font></div>
<td><font size=1 face="sans-serif">Kris Verlaenen <kris.verlaenen@cs.kuleuven.be></font>
<tr valign=top>
<td>
<div align=right><font size=1 face="sans-serif">cc</font></div>
<td><font size=1 face="sans-serif">Rules Users List <rules-users@lists.jboss.org></font>
<tr valign=top>
<td>
<div align=right><font size=1 face="sans-serif">Subject</font></div>
<td><font size=1 face="sans-serif">Re: [rules-users] [droolsflow] Code-based
constraints for EventWait nodes - is this possible?</font></table>
<br>
<table>
<tr valign=top>
<td>
<td></table>
<br></table>
<br>
<br>
<br><font size=2 face="sans-serif"><br>
Kris,</font><font size=3><br>
</font><font size=2 face="sans-serif"><br>
Thanks - making the class SimpleFact serializable fixed that error.</font><font size=3>
<br>
</font><font size=2 face="sans-serif"><br>
However, I now have a new problem: I have a rule flow containing a work
item - the handler attempts to update the SimpleFact instance in memory
before completing the task. The code in the executeWorkItem method is as
follows:</font><font size=3> <br>
</font><font size=2 face="sans-serif"><br>
Collection<FactHandle> factHandles =
ksession.getFactHandles(new ObjectFilter() {</font><font size=3> </font><font size=2 face="sans-serif"><br>
public boolean accept(Object
object) {</font><font size=3> </font><font size=2 face="sans-serif"><br>
return (object
instanceof SimpleFact);</font><font size=3> </font><font size=2 face="sans-serif"><br>
}</font><font size=3> </font><font size=2 face="sans-serif"><br>
});</font><font size=3> </font><font size=2 face="sans-serif"><br>
for (Iterator<FactHandle> iterator =
factHandles.iterator(); iterator.hasNext(); ) {</font><font size=3> </font><font size=2 face="sans-serif"><br>
FactHandle factHandle = iterator.next();</font><font size=3>
</font><font size=2 face="sans-serif"><br>
SimpleFact fact = (SimpleFact)
ksession.getObject(factHandle);</font><font size=3> </font><font size=2 face="sans-serif"><br>
fact.setStatus("Error");</font><font size=3>
</font><font size=2 face="sans-serif"><br>
ksession.update(factHandle, fact);</font><font size=3>
</font><font size=2 face="sans-serif"><br>
}</font><font size=3> <br>
</font><font size=2 face="sans-serif"><br>
workItemManager.completeWorkItem(workItem.getId(),
null);</font><font size=3> <br>
</font><font size=2 face="sans-serif"><br>
The call to getObject() causes the following exception to be thrown:</font><font size=3>
<br>
</font><font size=2 face="sans-serif"><br>
java.lang.NullPointerException</font><font size=3> </font><font size=2 face="sans-serif"><br>
at org.drools.command.runtime.rule.GetObjectCommand.execute(GetObjectCommand.java:35)</font><font size=3>
</font><font size=2 face="sans-serif"><br>
at org.drools.persistence.session.SingleSessionCommandService.execute(SingleSessionCommandService.java:254)</font><font size=3>
</font><font size=2 face="sans-serif"><br>
at org.drools.command.impl.CommandBasedStatefulKnowledgeSession.getObject(CommandBasedStatefulKnowledgeSession.java:369)</font><font size=3>
</font><font size=2 face="sans-serif"><br>
at com.test.StatusChangeWorkItemHandler.executeWorkItem(StatusChangeWorkItemHandler.java:37)</font><font size=3>
</font><font size=2 face="sans-serif"><br>
...</font><font size=3> <br>
</font><font size=2 face="sans-serif"><br>
I've attached another test case to illustrate the problem.</font><font size=3>
<br>
<br>
<br>
</font><font size=2 face="sans-serif"><br>
Once again, my sincere thanks for helping me with this.</font><font size=3>
<br>
</font><font size=2 face="sans-serif"><br>
Regards,</font><font size=3> <br>
</font><font size=2 face="sans-serif"><br>
Alan</font><font size=3> </font>
<p><font size=3><br>
<br>
</font>
<table width=100%>
<tr valign=top>
<td width=37%><font size=1 face="sans-serif"><b>Kris Verlaenen <kris.verlaenen@cs.kuleuven.be></b>
</font>
<p><font size=1 face="sans-serif">29/10/2009 12:00</font><font size=3>
</font>
<td width=62%>
<br>
<table width=100%>
<tr valign=top>
<td width=8%>
<div align=right><font size=1 face="sans-serif">To</font></div>
<td width=91%><font size=1 face="sans-serif">Alan.Gairey@tessella.com</font><font size=3>
</font>
<tr valign=top>
<td>
<div align=right><font size=1 face="sans-serif">cc</font></div>
<td><font size=1 face="sans-serif">Rules Users List <rules-users@lists.jboss.org></font><font size=3>
</font>
<tr valign=top>
<td>
<div align=right><font size=1 face="sans-serif">Subject</font></div>
<td><font size=1 face="sans-serif">Re: [rules-users] [droolsflow] Code-based
constraints for EventWait nodes - is this possible?</font></table>
<br>
<br>
<table>
<tr valign=top>
<td>
<td></table>
<br></table>
<br><font size=3><br>
<br>
</font><tt><font size=2><br>
Alan,<br>
<br>
The cause of the rollback of the transaction is this:<br>
Caused by: java.io.NotSerializableException: com.test.SimpleFact<br>
<br>
The reason is that, if you use persistence for your session, the<br>
persister will try to save all runtime state of the engine. This
does<br>
not only include process instances, but also rule-related state. By<br>
default, this also includes the data inserted in the memory. We support<br>
two strategies for storing this data: serialization of the data<br>
(default) or JPA-based storage of entities (by reference). In this<br>
case, the persister is trying to serialize the test object you inserted<br>
and fails. Making it serializable should fix this.<br>
<br>
Kris<br>
<br>
Quoting Alan.Gairey@tessella.com:<br>
<br>
> Kris,<br>
> <br>
> I've attached a simple test case (transaction manager, data source,<br>
> etc. <br>
> are configured via Spring). The error is thrown on line:<br>
> <br>
> ksession.insert(new SimpleFact());<br>
> <br>
> If this line is commented out, the rule flow executes without error.<br>
> <br>
> <br>
> <br>
> Many thanks for looking at this.<br>
> <br>
> Regards,<br>
> <br>
> Alan<br>
> <br>
> <br>
> <br>
> <br>
> Kris Verlaenen <kris.verlaenen@cs.kuleuven.be> <br>
> 28/10/2009 10:40<br>
> <br>
> To<br>
> Alan.Gairey@tessella.com<br>
> cc<br>
> Rules Users List <rules-users@lists.jboss.org><br>
> Subject<br>
> Re: [rules-users] [droolsflow] Code-based constraints for EventWait<br>
> nodes <br>
> - is this possible?<br>
> <br>
> <br>
> <br>
> <br>
> <br>
> <br>
> Alan,<br>
> <br>
> Could you send me the entire output / stack trace (as the rollback<br>
> of<br>
> the transaction is usually caused by another exception)?<br>
> <br>
> Or a simple test case that shows the error, so I can take a look?<br>
> <br>
> Thx,<br>
> Kris<br>
> <br>
> Quoting Alan.Gairey@tessella.com:<br>
> <br>
> > Kris,<br>
> > <br>
> > After posting my last question, I quickly came to the same<br>
> conclusion<br>
> > as <br>
> > you, so I'm now using a rule-based constraint in my EventWait<br>
> node.<br>
> > <br>
> > This however has presented a different problem. If I create my<br>
> > session <br>
> > from JPAKnowledgeService, then when I try to insert my fact into<br>
> the<br>
> > <br>
> > session, I get the following error:<br>
> > <br>
> > bitronix.tm.internal.BitronixRollbackException: transaction was<br>
> > marked as <br>
> > rollback only and has been rolled back<br>
> > at <br>
> ><br>
> bitronix.tm.BitronixTransaction.commit(BitronixTransaction.java:153)<br>
> > at <br>
> ><br>
><br>
bitronix.tm.BitronixTransactionManager.commit(BitronixTransactionManager.java:96)<br>
> > at <br>
> ><br>
><br>
org.drools.persistence.session.SingleSessionCommandService.execute(SingleSessionCommandService.java:258)<br>
> > at <br>
> ><br>
><br>
org.drools.command.impl.CommandBasedStatefulKnowledgeSession.insert(CommandBasedStatefulKnowledgeSession.java:305)<br>
> > (Everything works fine if I create my session from the knowledge<br>
> base<br>
> > - <br>
> > i.e. with no state persistence.)<br>
> > Prior to using a rule-based constraint (with no call to <br>
> > CommandBasedStatefulKnowledgeSession.insert), the session created<br>
> > from <br>
> > JPAKnowledgeService worked OK.<br>
> > I'm using the default JPA configuration from the Drools<br>
> documentation<br>
> > <br>
> > (persisting to H2 database, etc.).<br>
> > Any ideas what might be causing the problem?<br>
> > Many thanks,<br>
> > Alan<br>
> > <br>
> > <br>
> > <br>
> > <br>
> > Kris Verlaenen <kris.verlaenen@cs.kuleuven.be> <br>
> > 23/10/2009 03:00<br>
> > <br>
> > To<br>
> > Rules Users List <rules-users@lists.jboss.org>,<br>
> > Alan.Gairey@tessella.com<br>
> > cc<br>
> > Rules Users List <rules-users@lists.jboss.org><br>
> > Subject<br>
> > Re: [rules-users] [droolsflow] Code-based constraints for<br>
> EventWait<br>
> > nodes <br>
> > - is this possible?<br>
> > <br>
> > <br>
> > <br>
> > <br>
> > <br>
> > <br>
> > No, the constraint of an EventWait node (or the State node in<br>
> Drools<br>
> > 5.1) can only be rule-based. The reason for this is that
the rule<br>
> > engine knows when to re-evaluates rules (based on the evailable<br>
> > input).<br>
> > If you would use a code-based constraint, the engine would
have<br>
> no<br>
> > idea<br>
> > when this code constraint might become true (if it was false
at<br>
> the<br>
> > start). Only constant re-evaluation of the code constraint
could<br>
> > achieve this (which would be tremendously inefficient). Could
you<br>
> > explain why you would like to have this behaviour? Maybe
there is<br>
> > an<br>
> > alternative way to model this.<br>
> > <br>
> > To change the value of a variable from inside the process (using<br>
> an<br>
> > action), simply use kcontext.setVariable(name, value). We
do not<br>
> > recommend manually changing the value of a process variable from<br>
> > outside<br>
> > the engine. Again, could you explain why you would like
to have<br>
> > this<br>
> > functionality?<br>
> > <br>
> > Kris<br>
> > <br>
> > Quoting Alan.Gairey@tessella.com:<br>
> > <br>
> > > Can the constraint for an EventWait node in a flow be code-based<br>
> > > (rather <br>
> > > than rule-based)? The Eclipse plug-in (v 5.0.1) doesn't
allow<br>
> this<br>
> > to<br>
> > > be <br>
> > > specified, unlike say for a Split node, although the relevant<br>
> XML<br>
> > can<br>
> > > of <br>
> > > course be edited.<br>
> > > Trying to load such a process flow results in a<br>
> > NullPointerException,<br>
> > > <br>
> > > because the constraint is always interpreted as a rule.<br>
> > > <br>
> > > Ideally what I'd like to do is have an EventWait node where
the<br>
> > > constraint <br>
> > > tests the value of a process variable. This then leads me
to<br>
> > another<br>
> > > <br>
> > > question; is there a way of setting the value of a process<br>
> > variable<br>
> > > via <br>
> > > the Drools Flow API?<br>
> > > <br>
> > > Thanks in advance for any help,<br>
> > > <br>
> > > Alan<br>
> > > Tessella plc<br>
> > > 26 The Quadrant, Abingdon Science Park, Abingdon, Oxfordshire,<br>
> > OX14<br>
> > > 3YS<br>
> > > E: Alan.Gairey@tessella.com, T: +44 (0)1235 555511, F: +44<br>
> (0)1235<br>
> > > 553301<br>
> > > www.tessella.com Registered in England No.
1466429<br>
> > > <br>
> > > This message is commercial in confidence and may be privileged.<br>
> It<br>
> > is<br>
> > > <br>
> > > intended for the addressee(s) only. Access to this message
by<br>
> > anyone<br>
> > > else <br>
> > > is unauthorized and strictly prohibited. If you have received<br>
> this<br>
> > > message <br>
> > > in error, please inform the sender immediately. Please note
that<br>
> > > messages <br>
> > > sent or received by the Tessella e-mail system may be monitored<br>
> > and<br>
> > > stored <br>
> > > in an information retrieval system.<br>
> > > <br>
> > <br>
> > <br>
> > <br>
> > <br>
> > Disclaimer: http://www.kuleuven.be/cwis/email_disclaimer.htm<br>
> > <br>
> > <br>
> <br>
> <br>
> <br>
> <br>
> Disclaimer: http://www.kuleuven.be/cwis/email_disclaimer.htm<br>
> <br>
> <br>
<br>
<br>
<br>
<br>
Disclaimer: http://www.kuleuven.be/cwis/email_disclaimer.htm</font></tt><font size=3><br>
[attachment "drools-persistence-test.zip" deleted by Alan Gairey/Tessella]
</font><tt><font size=2>_______________________________________________<br>
rules-users mailing list<br>
rules-users@lists.jboss.org<br>
https://lists.jboss.org/mailman/listinfo/rules-users<br>
</font></tt>
<br>