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
[email protected]
https://lists.jboss.org/mailman/listinfo/jboss-user