Hi, I encountered the same problem in spring-managed transactions environment (on jboss 4.2.2) Here is the solution: I register DeleteJobsSynchronization within TransactionSynchronizationManager and extend DeleteJobsSynchronization to support Ordered interface. It allows TransactionSynchronizationManager to execute DeleteJobsSynchronization before SpringSessionSynchronization which closes hibernate session.
| public class SpringJobSession extends JobSession { | | Log log = LogFactory.getLog(SpringJobSession.class); | | protected Session session; | | public SpringJobSession(Session pSession) { | super(pSession); | // super.session is private... | session = pSession; | } | | public void deleteJobsForProcessInstance(ProcessInstance processInstance) { | try { | // we register synchronization within TransactionSynchronizationManager! | TransactionSynchronizationManager.registerSynchronization( | new DeleteJobsSynchronization(processInstance)); | } catch (Exception e) { | log.error(e); | throw new JbpmException("couldn't delete jobs for '"+processInstance+"'", e); | } | } | | // The very important issue here is that TransactionSynchronizationManager, | // within DeleteJobsSynchronization is registered, uses particular order | // while performing registered synchronizations. The order is specified by | // 'Ordered' interface. We have to set lower value than is specified for | // SpringSessionSynchronization to force execution of this synchronization | // before SpringSessionSynchronization will close the hibernate session. | private class DeleteJobsSynchronization extends TransactionSynchronizationAdapter implements Serializable { | private static final long serialVersionUID = 1L; | ProcessInstance processInstance; | public DeleteJobsSynchronization(ProcessInstance processInstance) { | this.processInstance = processInstance; | } | public void beforeCompletion() { | log.debug("deleting timers for process instance "+processInstance); | Query query = session.getNamedQuery("JobSession.deleteTimersForProcessInstance"); | query.setParameter("processInstance", processInstance); | int result = query.executeUpdate(); | log.debug(Integer.toString(result)+" remaining timers for '"+processInstance+"' are deleted"); | System.out.println(" -> 2 < ------"); | log.debug("deleting execute-node-jobs for process instance "+processInstance); | query = session.getNamedQuery("JobSession.deleteExecuteNodeJobsForProcessInstance"); | query.setParameter("processInstance", processInstance); | result = query.executeUpdate(); | log.debug(Integer.toString(result)+" remaining execute-node-jobs for '"+processInstance+"' are deleted"); | System.out.println(" -> 3 < ------"); | } | | @Override | public int getOrder() { | // SpringSessionSynchronization.getOrder() returns SessionFactoryUtils.SESSION_SYNCHRONIZATION_ORDER. | return SessionFactoryUtils.SESSION_SYNCHRONIZATION_ORDER - 50; | } | } | } | | public class SpringPersistenceService extends DbPersistenceService { | | public SpringPersistenceService(SpringPersistenceServiceFactory pPersistentServiceFactory) { | super(pPersistentServiceFactory); | } | | public JobSession getJobSession() { | if (jobSession==null) { | Session session = getSession(); | if (session!=null) { | jobSession = new SpringJobSession(session); | } | } | return jobSession; | } | | } | | <jbpm-configuration> | .... | <jbpm-context> | <service name="persistence" | factory="xxxx.workflow.jbpm.service.SpringPersistenceServiceFactory"/> | .... | </jbpm-context> | Should I create a jira bug for it or rather inform spring guys about this issue ? regards View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4117325#4117325 Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4117325 _______________________________________________ jboss-user mailing list jboss-user@lists.jboss.org https://lists.jboss.org/mailman/listinfo/jboss-user