[jboss-user] [JBoss jBPM] - custom task instance problem

XerXes_BPM do-not-reply at jboss.com
Fri Aug 31 11:14:40 EDT 2007


hi everyone!

i have a problem while trying to use custom task instances in jbpm.
for the first test i just wantet to copy the usual taskInstance and add an addittional property. the table gets created in the database and everything seems to work, but in the end when i try to save the process instance i get an hibernate error. i'm using jbpm 3.1.1 with ms sql server 2003 and jboss ide 1.6.

i have done what was mentioned in the userguide and in this forum:

- create a subclass of TaskInstance


  | public class CustomTaskInstance extends TaskInstance {
  | 	
  | 	private String customProperty;
  | 
  | 	public String getCustomProperty() {
  | 		return customProperty;
  | 	}
  | 
  | 	public void setCustomProperty(String customProperty) {
  | 		this.customProperty = customProperty;
  | 	}
  | 
  | }
  | 
  | 
 
 - create an implementation of org.jbpm.taskmgmt.TaskInstanceFactory


  | public class CustomTaskInstanceFactoryImpl implements TaskInstanceFactory {
  | 
  | 	public TaskInstance createTaskInstance(ExecutionContext executionContext) {
  | 		
  | 		//just a simple mapping to CustomTaskInstance
  | 		
  | 		return new CustomTaskInstance();
  | 	}
  | 
  | }
  | 
  | 

- update the property jbpm.task.instance.factory to specify the name of custom class 


  | <bean name='jbpm.task.instance.factory' class='com.dumdidum.pc.CustomTaskInstanceFactoryImpl' singleton='true' />
  | 

- create a mapping file for the subclass, for mapping the extra properties you want to save 


  | <?xml version="1.0"?>
  | 
  | <!DOCTYPE hibernate-mapping PUBLIC
  |     "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
  |     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  | 
  | <hibernate-mapping default-access="field">
  | 
  |   <class name="com.dumdidum.pc.CustomTaskInstance" 
  |          table="JBPM_CUSTOMTASKINSTANCE"
  |          discriminator-value="C">
  |     <id name="id" column="ID_"><generator class="native" /></id>
  |     <discriminator type="char" column="CLASS_"/>
  |   
  |     <property name="name"         column="NAME_" />
  |     <property name="description"  column="DESCRIPTION_" type="string_max" length="4000"/>
  |     <property name="actorId"      column="ACTORID_" index="IDX_TASK_ACTORID"/>
  |     <property name="create"       column="CREATE_" />
  |     <property name="start"        column="START_" />
  |     <property name="end"          column="END_" />
  |     <property name="dueDate"      column="DUEDATE_" />
  |     <property name="priority"     column="PRIORITY_" />
  |     <property name="isCancelled"  column="ISCANCELLED_" />
  |     <property name="isSuspended"  column="ISSUSPENDED_" />
  |     <property name="isOpen"       column="ISOPEN_" />
  |     <property name="isSignalling" column="ISSIGNALLING_" />
  |     <property name="isBlocking"   column="ISBLOCKING_" />
  |     <property name="customProperty"   column="CUSTOMPROPERTY_" />
  |     
  |     <many-to-one name="task"
  |                  column="TASK_"
  |                  foreign-key="FK_TASKINST_TASK"/>
  |     <many-to-one name="token"
  |                  column="TOKEN_" 
  |                  foreign-key="FK_TASKINST_TOKEN"/>
  |     <many-to-one name="swimlaneInstance" 
  |                  column="SWIMLANINSTANCE_" 
  |                  foreign-key="FK_TASKINST_SLINST"/>
  |     <many-to-one name="taskMgmtInstance" 
  |                  column="TASKMGMTINSTANCE_" 
  |                  foreign-key="FK_TASKINST_TMINST"/>
  | 
  |     <map name="variableInstances" cascade="all">
  |       <key column="TASKINSTANCE_" foreign-key="FK_VAR_TSKINST"/>
  |       <index type="string" column="NAME_" />
  |       <one-to-many class="org.jbpm.context.exe.VariableInstance" />
  |     </map>
  |     <set name="pooledActors" 
  |          cascade="all"
  |          table="JBPM_TASKACTORPOOL">
  |       <key column="TASKINSTANCE_" foreign-key="FK_TASKACTPL_TSKI"/>
  |       <many-to-many class="org.jbpm.taskmgmt.exe.PooledActor" column="POOLEDACTOR_" />
  |     </set>
  |     <list name="comments" cascade="all" >
  |       <key column="TASKINSTANCE_" />
  |       <index column="TASKINSTANCEINDEX_" />
  |       <one-to-many class="org.jbpm.graph.exe.Comment" />
  |     </list>
  | 
  |   </class>
  | 
  | </hibernate-mapping>
  | 
  | 

- add that mapping file to the list of mapping files


  | <mapping resource="com/dumdidum/pc/CustomTaskInstance.hbm.xml"/>
  | 

- use custom assignementHandler


  | public class MyAssignmentHandler implements AssignmentHandler {
  | 
  | 	public void assign(Assignable assignable, ExecutionContext executionContext)
  | 			throws Exception {
  | 
  | 
  | 		CustomTaskInstance cti = (CustomTaskInstance) assignable;
  | 	    cti.setActorId("UserPc1");
  | 	    cti.setCustomProperty("testtest");
  | 	    
  | 	}
  | 
  | }
  | 
  | 

the simple process:

  | <?xml version="1.0" encoding="UTF-8"?>
  | 
  | <process-definition
  |   xmlns="urn:jbpm.org:jpdl-3.1"  name="simpleTask">
  |    <start-state name="start">
  |       <transition name="" to="task1"></transition>
  |    </start-state>
  |    <end-state name="end1"></end-state>
  |    <task-node name="task1">
  |    	  <task name="testTask">
  |    	  	<assignment class="com.dumdidum.pc.MyAssignmentHandler"></assignment>
  |    	  </task>
  |       <transition name="" to="state1"></transition>
  |    </task-node>
  |    <state name="state1">
  |       <transition name="" to="end1"></transition>
  |    </state>
  | </process-definition>
  | 

the result is the following error when trying to flush the session:


  | 17:10:42,305 [main] DEBUG Services : executing default save operations
  | 17:10:42,305 [main] DEBUG HibernateSaveOperation : saving process instance
  | 17:10:42,305 [main] DEBUG SaveLogsOperation : flushing logs to logging service.
  | org.jbpm.persistence.JbpmPersistenceException: couldn't commit hibernate session
  | 	at org.jbpm.persistence.db.DbPersistenceService.close(DbPersistenceService.java:171)
  | 	at org.jbpm.svc.Services.close(Services.java:211)
  | 	at org.jbpm.JbpmContext.close(JbpmContext.java:141)
  | 	at com.rockwell.pc.JBPMWrapper.participateInProcess(JBPMWrapper.java:218)
  | 	at com.rockwell.pc.ProcessTester.main(ProcessTester.java:36)
  | Caused by: org.hibernate.AssertionFailure: null id in org.jbpm.taskmgmt.log.TaskAssignLog entry (don't flush the Session after an exception occurs)
  | 	at org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:48)
  | 	at org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:150)17:10:42,315 [main] WARN  JDBCExceptionReporter : SQL Error: 547, SQLState: 23000
  | 17:10:42,315 [main] ERROR JDBCExceptionReporter : INSERT statement conflicted with COLUMN FOREIGN KEY constraint 'FK_LOG_TASKINST'. The conflict occurred in database 'JBPM', table 'JBPM_TASKINSTANCE', column 'ID_'.
  | 17:10:42,315 [main] DEBUG JbpmContext : closing JbpmContext
  | 17:10:42,315 [main] DEBUG Services : closing service 'persistence': org.jbpm.persistence.db.DbPersistenceService at 1abdac9
  | 17:10:42,315 [main] DEBUG DbPersistenceService : committing hibernate transaction
  | 17:10:42,325 [main] ERROR AssertionFailure : an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session)
  | org.hibernate.AssertionFailure: null id in org.jbpm.taskmgmt.log.TaskAssignLog entry (don't flush the Session after an exception occurs)
  | 	at org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:48)
  | 	at org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:150)
  | 	at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:106)
  | 	at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:195)
  | 	at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:76)
  | 	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
  | 	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:980)
  | 	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:353)
  | 	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
  | 	at org.jbpm.persistence.db.DbPersistenceService.close(DbPersistenceService.java:161)
  | 	at org.jbpm.svc.Services.close(Services.java:211)
  | 	at org.jbpm.JbpmContext.close(JbpmContext.java:141)
  | 	at com.rockwell.pc.JBPMWrapper.participateInProcess(JBPMWrapper.java:218)
  | 	at com.rockwell.pc.ProcessTester.main(ProcessTester.java:36)
  | 17:10:42,345 [main] ERROR Services : problem closing service 'persistence'
  | org.jbpm.persistence.JbpmPersistenceException: couldn't commit hibernate session
  | 	at org.jbpm.persistence.db.DbPersistenceService.close(DbPersistenceService.java:171)
  | 	at org.jbpm.svc.Services.close(Services.java:211)
  | 	at org.jbpm.JbpmContext.close(JbpmContext.java:141)
  | 	at com.rockwell.pc.JBPMWrapper.participateInProcess(JBPMWrapper.java:218)
  | 	at com.rockwell.pc.ProcessTester.main(ProcessTester.java:36)
  | Caused by: org.hibernate.AssertionFailure: null id in org.jbpm.taskmgmt.log.TaskAssignLog entry (don't flush the Session after an exception occurs)
  | 	at org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:48)
  | 	at org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:150)
  | 	at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:106)
  | 	at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:195)
  | 	at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:76)
  | 	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
  | 	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:980)
  | 	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:353)
  | 	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
  | 	at org.jbpm.persistence.db.DbPersistenceService.close(DbPersistenceService.java:161)
  | 	... 4 more
  | 
  | 	at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:106)
  | 	at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:195)
  | 	at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:76)
  | 	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
  | 	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:980)
  | 	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:353)
  | 	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
  | 	at org.jbpm.persistence.db.DbPersistenceService.close(DbPersistenceService.java:161)
  | 	... 4 more
  | org.jbpm.JbpmException: problem closing services {persistence=org.jbpm.persistence.JbpmPersistenceException: couldn't commit hibernate session}
  | 	at org.jbpm.svc.Services.close(Services.java:223)
  | 	at org.jbpm.JbpmContext.close(JbpmContext.java:141)
  | 	at com.rockwell.pc.JBPMWrapper.participateInProcess(JBPMWrapper.java:218)
  | 	at com.rockwell.pc.ProcessTester.main(ProcessTester.java:36)
  | Caused by: org.jbpm.persistence.JbpmPersistenceException: couldn't commit hibernate session
  | 	at org.jbpm.persistence.db.DbPersistenceService.close(DbPersistenceService.java:171)
  | 	at org.jbpm.svc.Services.close(Services.java:211)
  | 	... 3 more
  | Caused by: org.hibernate.AssertionFailure: null id in org.jbpm.taskmgmt.log.TaskAssignLog entry (don't flush the Session after an exception occurs)
  | 	at org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:48)
  | 	at org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:150)
  | 	at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:106)
  | 	at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:195)
  | 	at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:76)
  | 	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
  | 	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:980)
  | 	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:353)
  | 	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
  | 	at org.jbpm.persistence.db.DbPersistenceService.close(DbPersistenceService.java:161)
  | 	... 4 more
  | 17:10:42,345 [main] DEBUG Services : closing service 'logging': org.jbpm.logging.db.DbLoggingService at 1e8c585
  | 
  | 

any help would be appreciated!
best regards
gregor

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4080044#4080044

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4080044



More information about the jboss-user mailing list