ode-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Tammo van Lessen (JIRA)" <j...@apache.org>
Subject [jira] [Assigned] (ODE-894) BPEL with <pick> followed by <invoke> fails with NPE when using JPA persistence
Date Sun, 15 Sep 2013 16:42:51 GMT

     [ https://issues.apache.org/jira/browse/ODE-894?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel

Tammo van Lessen reassigned ODE-894:

    Assignee: Tammo van Lessen
> BPEL with <pick> followed by <invoke> fails with NPE when using JPA persistence
> -------------------------------------------------------------------------------
>                 Key: ODE-894
>                 URL: https://issues.apache.org/jira/browse/ODE-894
>             Project: ODE
>          Issue Type: Bug
>          Components: BPEL Runtime
>    Affects Versions: 1.3.4
>         Environment: JBI distribution on servicemix 3.3.2
>            Reporter: Kurt Westerfeld
>            Assignee: Tammo van Lessen
>             Fix For: 1.3.6, 1.4
> We have a bpel process which contains a <pick> followed by a few <assign>
and an <invoke> operation.  When running this process, we can resume the <pick>
but soon afterwards an NPE occurs as in the following stack trace:
> 13:04:04,013 | ERROR | pool-5-thread-1 | SimpleScheduler          | .simple.SimpleScheduler$RunJob
 545 | Error while processing a persisted job: Job hqejbhcnphr5nd9dfp0pnt time: 2010-10-05
13:04:00 EDT transacted: true persisted: true details: JobDetails( instanceId: null mexId:
hqejbhcnphr5nd9dfp0pns processId: {(endpoint-name-removed)-0 type: INVOKE_INTERNAL channel:
null correlatorId: null correlationKeySet: null retryCount: null inMem: false detailsExt:
> org.apache.ode.bpel.iapi.Scheduler$JobProcessorException: java.lang.NullPointerException
> 	at org.apache.ode.bpel.engine.BpelEngineImpl.onScheduledJob(BpelEngineImpl.java:478)
> 	at org.apache.ode.bpel.engine.BpelServerImpl.onScheduledJob(BpelServerImpl.java:450)
> 	at org.apache.ode.scheduler.simple.SimpleScheduler$RunJob$1.call(SimpleScheduler.java:518)
> 	at org.apache.ode.scheduler.simple.SimpleScheduler$RunJob$1.call(SimpleScheduler.java:513)
> 	at org.apache.ode.scheduler.simple.SimpleScheduler.execTransaction(SimpleScheduler.java:284)
> 	at org.apache.ode.scheduler.simple.SimpleScheduler.execTransaction(SimpleScheduler.java:239)
> 	at org.apache.ode.scheduler.simple.SimpleScheduler$RunJob.call(SimpleScheduler.java:512)
> 	at org.apache.ode.scheduler.simple.SimpleScheduler$RunJob.call(SimpleScheduler.java:496)
> 	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
> 	at java.util.concurrent.FutureTask.run(FutureTask.java:138)
> 	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
> 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
> 	at java.lang.Thread.run(Thread.java:619)
> Caused by: java.lang.NullPointerException
> 	at org.apache.ode.bpel.engine.MessageImpl.getMessage(MessageImpl.java:104)
> 	at org.apache.ode.bpel.engine.PartnerLinkMyRoleImpl.computeCorrelationKeys(PartnerLinkMyRoleImpl.java:294)
> 	at org.apache.ode.bpel.engine.PartnerLinkMyRoleImpl.findRoute(PartnerLinkMyRoleImpl.java:122)
> 	at org.apache.ode.bpel.engine.BpelProcess.invokeProcess(BpelProcess.java:233)
> 	at org.apache.ode.bpel.engine.BpelProcess.invokeProcess(BpelProcess.java:279)
> 	at org.apache.ode.bpel.engine.BpelProcess.handleJobDetails(BpelProcess.java:426)
> 	at org.apache.ode.bpel.engine.BpelEngineImpl.onScheduledJob(BpelEngineImpl.java:460)
> 	... 12 more
> This problem then continues for a while, while the scheduling and refiring of this job
> In diagnosing the problem, it was seen that the dao-jpa persistence has an issue in that
the MessageDAOImpl class is never persisted with the MEX that created it.  The NPE occurs
when the internal <pick> resumes on a message exchange that is later scheduled, hydrated
from persistence but the MEX does not contain the "receive" message.
> Specifically, the class org.apache.ode.dao.jpa.MessageExchangeDAOImpl is not doing is
not doing a getEM().persist() on the MessageDAOImpl, and there is no cascading one-to-many
setup to cause the MessageDAOImpl to be persisted.  The hibernate dao does persist the message
in this case, and testing with the hibernate back-end caused the issue to go away.  However,
we are experiencing other "primary constraint" violations with the hibernate back-end, so
we want to use the JPA back-end.
> Here is a minimal patch which we tested which fixes the issue:
>   Index: dao-jpa/src/main/java/org/apache/ode/dao/jpa/MessageExchangeDAOImpl.java
>   ===================================================================
>   --- dao-jpa/src/main/java/org/apache/ode/dao/jpa/MessageExchangeDAOImpl.java    (revision
>   +++ dao-jpa/src/main/java/org/apache/ode/dao/jpa/MessageExchangeDAOImpl.java    (working
>   @@ -128,6 +128,7 @@
>        public MessageDAO createMessage(QName type) {
>            MessageDAOImpl ret = new MessageDAOImpl(type,this);
>   +        getEM().persist(ret);
>            return ret ;
>        }
> We do not know whether this patch is the right way to fix this, but it does seem to be
similar to the hibernate back-end. One issue with this minimal change is potentially not having
the MessageDAOImpl cleanup in place--not sure how best to approach that.
> Another approach considered could be to harden the PartnerLinkMyRoleImpl.computeCorrelationKeys
method to ensure it doesn't get an NPE when this message component is missing.  Not sure which
way is best.

This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

View raw message