[jboss-user] [JBoss jBPM] - JEE AS / jBPM / Transactions problem

gchanteb do-not-reply at jboss.com
Thu Apr 9 06:55:05 EDT 2009


Hi,

I'm trying to implemente a simple jBPM use case in JBoss AS, so using JEE.

First i made two ear for my tests:
- One with an EJB which just launch a jbpm process and use DB "JbpmDS", which is an XA datasource.
- A second with an EJB which update data (with entity beans - persistence.xml) using DB "JbpmDSClient", which is an XA datasource.
That worked fine separatly.
But, i wanted to make them work together in only one ear, to call an EJB-remote method which launches a simple process BUT with an update in database.

And i don't know why but:

1 - If i use the same db in persistence.xml that in jbpm config (=> "JbpmDS"), i have sometime an error when i try to only launch a process (without update in DB), (it's not always the same):

anonymous wrote : 		ORA-00001: violation de contrainte unique (JBPM.SYS_C005943)
  | 		..
  | 		or ORA-00001: violation de contrainte unique (JBPM.SYS_C005904) for example

	It's like there was a conflict between jbpm config and my persistence.xml config for my entity beans.
	
2 - If i try to use a different DB in persistence.xml, i have this error when i try to only launch a process (without update in DB):

anonymous wrote : 	12:31:43,629 WARN  [JDBCExceptionReporter] SQL Error: 2289, SQLState: 42000
  | 	12:31:43,629 ERROR [JDBCExceptionReporter] ORA-02289: la s????????????????????????????????quence n'existe pas (the sequence doesn't exist)
	
So.... I would like to know if somebody got an idea? What is the best practice to work with jBPM and to update DB in the same time? What about transactions?
What about the context.close?
I found this paper: http://www.jboss.org/community/docs/DOC-11090 which explains how use CMT with jBPM....
I would like to know how to properly inject my hibernate session from persistence.xml in jBPM context... and what is really the good config?

In the wiki for example they said to have this conf:

	<jbpm-context>
  | 		<service name="persistence" factory="org.jbpm.persistence.jta.JtaDbPersistenceServiceFactory" />
  | 	</jbpm-context>

But sometime i read to put (here for example http://www.jboss.org/index.html?module=bb&op=viewtopic&t=111429&postdays=0&postorder=asc&start=10):

	<service name="persistence">
  | 		<factory>
  | 			<bean name="persistence.factory"
  | 				class="org.jbpm.persistence.db.DbPersistenceServiceFactory">
  | 				<field name="isTransactionEnabled">
  | 					<false />
  | 				</field>
  | 			</bean>
  | 		</factory>
  | 	</service>

And in the doc, chapter 7.4 http://docs.jboss.com/jbpm/v3.2/userguide/html_single/ this is 2nd choice whereas in 9.2, this is the first.

That's why i'm a bit lost... I have read too much different things..... I just want to do this in the same ejb method:

1- launch a process.
2- update in db.
3- rollback the 2 actions if i have a problem.

Here is the code of my ejb "ManagementJBPM":

package **package** ;
  | 
  | import javax.ejb.EJB;
  | import javax.ejb.Stateless;
  | 
  | import org.jbpm.JbpmConfiguration;
  | import org.jbpm.JbpmContext;
  | import org.jbpm.db.GraphSession;
  | import org.jbpm.graph.exe.ExecutionContext;
  | import org.jbpm.graph.exe.ProcessInstance;
  | import org.jbpm.persistence.db.DbPersistenceService;
  | import org.jbpm.persistence.jta.JtaDbPersistenceService;
  | 
  | import **package**.ManagementClientLocal;
  | import **package**.CreationProcessException;
  | import **package**.LaunchProcessException;
  | import **package**.NoClientDefinedException;
  | 
  | @Stateless
  | public class ManagementJBPM implements ManagementJBPMRemote
  | {
  | 	private static JbpmConfiguration jBPMConfiguration = null;
  | 	
  | 	@EJB(mappedName="JBPMBusiness-ear/ManagementClient/local-**package**.ManagementClientLocal")
  | 	private ManagementClientLocal managementClient;
  | 	
  | 	public void launchSimpleProcess(String processName, String clientId) throws LaunchProcessException
  | 	{	
  | 		long processId;
  | 		
  | 		try
  | 		{
  | 			processId = createProcess(processName); // Creation of the process.
  | 		}
  | 		catch(CreationProcessException exc) { throw new LaunchProcessException(exc.getMessage()); }
  | 
  | 		try
  | 		{
  | 			managementClient.updateClient(clientId, processId); // Update of client infos.
  | 		}
  | 		catch(NoClientDefinedException exc) { throw new LaunchProcessException(exc.getMessage()); }
  | 	}
  | 	
  | 	private long createProcess(String processName) throws CreationProcessException
  | 	{
  | 		JbpmContext jbpmContext = initJBPMContext(); // Creation of the context.
  | 
  | 		Long processId = null;
  | 
  | 		try
  | 		{
  | 			ProcessInstance processInstance = jbpmContext.newProcessInstance(processName); // Process created.
  | 			processId = processInstance.getId();
  | 		}
  | 		catch(Exception exc)
  | 		{
  | 			throw new CreationProcessException("Error during the creation of the process ");
  | 		}
  | 		finally 
  | 		{
  | 			jbpmContext.close(); // It's necessary to close the context.
  | 		}
  | 
  | 		return processId;
  | 	}
  | 	
  | 	private JbpmContext initJBPMContext()
  | 	{
  | 		if(jBPMConfiguration==null) // If jBPMConfiguration doesn't exist.
  | 		{
  | 			jBPMConfiguration = JbpmConfiguration.getInstance(); // We get it.
  | 		}
  | 		JbpmContext jbpmContext = jBPMConfiguration.createJbpmContext(); // Creation of the context.
  | //        jbpmContext.setSession(persServ.getSessionFactory().getCurrentSession());
  | 		return jbpmContext;
  | 	}
  | }
(All the exceptions have ApplicationException(rollback=true))

Here is my persistence.xml conf for my entity beans:

<?xml version="1.0" encoding="UTF-8"?>
  | <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  |   xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
  |   <persistence-unit name="clientdb" transaction-type="JTA">
  |     <provider>org.hibernate.ejb.HibernatePersistence</provider>
  |     <jta-data-source>java:JbpmDS</jta-data-source>
  |     <properties>
  |       <!-- Dialect and schema check -->
  |       <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9Dialect" />
  |       <property name="hibernate.hbm2ddl.auto" value="create-drop" />
  |       
  |       <!-- logging properties --> 
  |       <property name="hibernate.show_sql" value="true" />
  |       <property name="hibernate.format_sql" value="true" />
  |       <property name="hibernate.use_sql_comments" value="true" />
  |       <property name="hibernate.generate_statistics" value="true" />        
  |     </properties>
  |   </persistence-unit>
  | </persistence>

Here is my jbpm.cfg.xml:

<jbpm-configuration>
  | 
  |   <jbpm-context>
  |     <service name="persistence" factory="org.jbpm.persistence.jta.JtaDbPersistenceServiceFactory" />
  |     <service name="message" factory="org.jbpm.msg.jms.JmsMessageServiceFactory" />
  |     <service name="scheduler" factory="org.jbpm.scheduler.ejbtimer.EntitySchedulerServiceFactory" />
  |     <service name="tx" factory="org.jbpm.tx.TxServiceFactory" />
  |     <service name="authentication" factory="org.jbpm.security.authentication.DefaultAuthenticationServiceFactory" />
  |   </jbpm-context>
  | 
  |   <string name="jbpm.classLoader" value="context" />
  | 
  |   <null name="jbpm.job.executor" />
  | 
  | </jbpm-configuration>

Here is my JbpmDS:

<?xml version="1.0" encoding="UTF-8"?>
  | 
  | <datasources>
  |   <xa-datasource>
  |   
  |     <jndi-name>JbpmDS</jndi-name>
  | 	
  |     <xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
  |     <xa-datasource-property name="URL">jdbc:oracle:thin:@localhost:1521</xa-datasource-property>
  |     <xa-datasource-property name="User">jBPM</xa-datasource-property>
  |     <xa-datasource-property name="Password">adminadmin</xa-datasource-property>
  | 
  | 	<isSameRM-override-value>false</isSameRM-override-value>
  | 	
  | 	<!--
  | 		<min-pool-size>10</min-pool-size>
  | 		<max-pool-size>100</max-pool-size>
  | 	-->
  | 	
  | 	<!--
  | 		<background-validation>true</background-validation>
  | 		<background-validation-millis>60000</background-validation-millis>
  | 	-->
  | 
  | 	<!--
  | 		<idle-timeout-minutes>15</idle-timeout-minutes>
  | 	 -->
  | 	
  |     <no-tx-separate-pools/>
  |  
  |     <valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker</valid-connection-checker-class-name>
  |     <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
  |     <stale-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleStaleConnectionChecker</stale-connection-checker-class-name>
  | 
  | 	<!--     
  | 		<use-fast-fail>true</use-fast-fail>
  | 	-->
  | 	     
  |     <prepared-statement-cache-size>200</prepared-statement-cache-size>
  |     <share-prepared-statements/>
  | 
  |       <metadata>
  |          <type-mapping>Oracle9i</type-mapping>
  |       </metadata>
  |   </xa-datasource>
  | 
  |   <mbean code="org.jboss.resource.adapter.jdbc.vendor.OracleXAExceptionFormatter" 
  |          name="jboss.jca:service=OracleXAExceptionFormatter">
  |     <depends optional-attribute-name="TransactionManagerService">jboss:service=TransactionManager</depends>
  |   </mbean>
  | 
  | </datasources>

My 2nd DS is the same with an other name.

And here is my hibernate.cfg.xml:

<hibernate-configuration>
  |   <session-factory>
  | 
  |     <!-- hibernate dialect -->
  |     <property name="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</property>
  | 
  |     <!-- DataSource properties -->
  |     <property name="hibernate.connection.datasource">java:JbpmDS</property>
  | 
  |     <!-- JTA transaction properties -->
  |     <property name="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property>
  |     <property name="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup</property>
  | 
  |     <!-- Simple memory-only cache -->
  |     <property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
  | 	
If somebody have an answer, i take it :p
Thx.

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

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



More information about the jboss-user mailing list