You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ode.apache.org by "Tammo van Lessen (JIRA)" <ji...@apache.org> on 2013/09/15 18:34:52 UTC

[jira] [Updated] (ODE-894) BPEL with followed by fails with NPE when using JPA persistence

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

Tammo van Lessen updated ODE-894:
---------------------------------

    Fix Version/s: 1.4
                   1.3.6
    
> 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
>             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 continues.
> 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 997965)
>   +++ dao-jpa/src/main/java/org/apache/ode/dao/jpa/MessageExchangeDAOImpl.java    (working copy)
>   @@ -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