cancel
Showing results for 
Search instead for 
Did you mean: 

Activiti Engine and container-managed entity manager

lis
Champ in-the-making
Champ in-the-making
Is it possible to configure Activiti engine to use container-managed entity manager(em) when
I invoke Activiti API in EJB method?

@PersistenceContext(name = "persistence/SKO_EM")
private EntityManager em;

public testEJBMethod() {
//invoke Activiti API - I want Activiti engine to use em injected via annotation @PersistenceContext
// here Activiti engine can update some JPA variable in task listener, for example
….


//invoke some custom logic
TestEntity testEntity = em.find(..);
testEntity.setField(…);


}

Lis
12 REPLIES 12

lis
Champ in-the-making
Champ in-the-making
jndi name = "java:comp/env/" + UNIT_NAME,
UNIT_NAME we can get from configuration variable ProcessEngineConfiguration.getJpaPersistenceUnitName().

lis
Champ in-the-making
Champ in-the-making
If I write  @PersistenceContext(name = "UNIT_NAME") private EntityManager em;
in EJB, than container MAY create JNDI reference with name "java:comp/env/UNIT_NAME",
but NOT REQUIRED by specification.

p4w3l
Champ in-the-making
Champ in-the-making
Trying already 3 weeks to implement custom EntityManagerSessionFactory w/o success. Please advice how to do it.
Need to have same entity manager in EJB and Activiti.

<java>
public class CMPEntityManagerSessionFactory implements SessionFactory {

public Class<?> getSessionType() {
  return EntityManagerSession.class;
}

private EntityManager lookupEntityManager() {
  try {
   return InitialContext.doLookup("java:jboss/myEntityManager");
  } catch (NamingException e) {
   throw new RuntimeException("Unable to lookup entity manager.", e);
  }
}

public Session openSession() {
  return new EntityManagerSessionImpl( null, lookupEntityManager(), false, false );
}

}
</java>

I start Process engine with ProcessEngineLookup :

<java>
public ProcessEngine getProcessEngine() {
 
  CdiJtaProcessEngineConfiguration processEngineConfiguration = new CdiJtaProcessEngineConfiguration();
  processEngineConfiguration.setProcessEngineName("default");
  processEngineConfiguration.setDataSourceJndiName("java:jboss/datasources/ACTIVITD");
  processEngineConfiguration.setTransactionManager( lookupTransactionManager() );
  processEngineConfiguration.setDatabaseSchemaUpdate( ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE );
  processEngineConfiguration.setHistory( HistoryLevel.FULL.getKey() );

  ArrayList<BpmnParseHandler> handlers = new ArrayList<BpmnParseHandler>();
  handlers.add( new org.activiti.cdi.impl.event.CdiEventSupportBpmnParseHandler() );
  processEngineConfiguration.setPostBpmnParseHandlers( handlers );
 
  processEngineConfiguration.setJobExecutorActivate(true);
 
  // processEngineConfiguration.setJpaEntityManagerFactory( lookupEntityManagerFactory() );
  processEngineConfiguration.setTransactionsExternallyManaged( true );
  processEngineConfiguration.setJpaHandleTransaction( false );
  processEngineConfiguration.setJpaCloseEntityManager( false );
 
  processEngine = processEngineConfiguration.buildProcessEngine();
 
  List<SessionFactory> sessionFactories = sessionFactories = new ArrayList<SessionFactory>();
  sessionFactories.add( new LdapUserManagerFactory() );
  sessionFactories.add( new CMPEntityManagerSessionFactory() );
  if( processEngineConfiguration.getCustomSessionFactories() == null )
   processEngineConfiguration.setCustomSessionFactories( sessionFactories );
  else
   processEngineConfiguration.getCustomSessionFactories().addAll( sessionFactories );
  processEngine = processEngineConfiguration.buildProcessEngine();
  return processEngine;
}
</java>

and having:

<code>
org.activiti.engine.ActivitiException: unknown variable type name jpa-entity
</code>