CDI support within Camunda Java delegate (using Weld CDI in JUnit)

3,076 views
Skip to first unread message

davy...@gmail.com

unread,
Jan 27, 2014, 4:59:17 AM1/27/14
to camunda-...@googlegroups.com
Hi,

I would like to use Weld CDI to injec an instance of a service interface into a Camunda Java delegate, so something like:

<bpmn2:serviceTask
id="doSomething"
camunda:class="my.package.DoSomethingServiceCamundaDelegate"
name="Do Something">

package my.package;

import javax.inject.Inject;

import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.JavaDelegate;

public class DoSomethingServiceCamundaDelegate
implements JavaDelegate {

@Inject
private DoSomethingService doSomethingService;

@Override
public void execute(DelegateExecution arg0) {
doSomethingService.doSomething();
}
}

I tried it in a J2SE 1.7 setup with Camunda 7.0.0 using a Unit test, so outside a J2EE container, but unfortunately doSomethingService stays null.

In the Unit test I initialize the Weld CDI container using :

package my.package;

...

public class ProcessTest {

private Weld weld;

@Before public void startCDIContainer() {
weld = new Weld();
weld.initialize();
}

@Test public void test() {
RepositoryService rs =
ProcessEngines.
getDefaultProcessEngine().
getRepositoryService();
DeploymentBuilder db =
rs.createDeployment();
db.addClasspathResource(
"Process.bpmn");
db.deploy();

ProcessEngine pe =
ProcessEngines.getDefaultProcessEngine();
pe.getRuntimeService().
startProcessInstanceById("Process:1:3");
}

@After public void stopCDIContainer() {
weld.shutdown();
}
}

Best regards,
Davy Toch

Christian Lipphardt

unread,
Jan 27, 2014, 6:07:10 AM1/27/14
to camunda-...@googlegroups.com, davy...@gmail.com
Hi Davy,

To use CDI injection in a bean in a JUnit test, see http://docs.camunda.org/latest/guides/user-guide/#cdi-and-java-ee-integration .

In general: 

- include camunda-engine-cdi maven dependency to your pom
- create a camunda.cfg.xml in your src/test/resources folder or bootstrap a process engine programmatically with a CdiStandaloneProcessEngineConfiguration.
- add a beans.xml to your META-INF
- In your bpmn model, do not use camunda:class, use camunda:expression / camunda:delegateExpression to reference your bean.

Example for camunda.cfg.xml:
<?xml version="1.0" encoding="UTF-8"?>


<bean id="processEngineConfiguration"
class="org.camunda.bpm.engine.cdi.CdiStandaloneProcessEngineConfiguration">
    
        <property name="jdbcUrl" value="jdbc:h2:mem:activiti" />
<property name="databaseSchemaUpdate" value="true" />
<property name="jobExecutorActivate" value="false" />
<property name="mailServerPort" value="5025" />
<property name="customPostBPMNParseListeners">
<list>
<bean class="org.camunda.bpm.engine.cdi.impl.event.CdiEventSupportBpmnParseListener" />
</list>
</property>

</bean>

</beans>


Alfonso Mateos Alarcón

unread,
Feb 13, 2014, 11:09:03 AM2/13/14
to camunda-...@googlegroups.com, davy...@gmail.com
Hi Christian,

Which would be the steps to get the same thing  working (use CDI injection in a JavaDelegate) but OUTSIDE of JUnit, I mean, in my running process? 

That would be really useful for me.
Thanks a lot in advance ;-)

Christian Lipphardt

unread,
Feb 22, 2014, 5:39:19 AM2/22/14
to camunda-...@googlegroups.com, davy...@gmail.com
Hi Alfonso,

You just have to follow the same steps as I wrote above.
There is also a maven archetype for ejb/cdi integration available trough our nexus til it is published to maven central.
Coordinates are 
org.camunda.bpm.archetype - camunda-archetype-ejb-war


Cheers, 
Christian

Stefan Schulz

unread,
Mar 11, 2014, 12:12:22 PM3/11/14
to camunda-...@googlegroups.com, davy...@gmail.com
Hello, Christian.

I want to do that, too...so i made a war project with a process in it following the tutorial found under


and deployed it to camunda bpm jboss (7.1.0-alpha3). Works fine. In my process, i have a service task wired to a java delegate looking like this:

package de.gravitex.bpmtest.processref.delegate.anothersimpleprocess;

import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.JavaDelegate;

public class AnotherDelegate implements JavaDelegate {
 
 
public void execute(DelegateExecution arg0) throws Exception {
 
System.out.println("...AnotherDelegate...");
 
}
}


I thought that my next steps should be to

1.) add the dependeny 

<dependency>
   
<groupId>org.camunda.bpm</groupId>
   
<artifactId>camunda-engine</artifactId>
   
<version>7.1.0-alpha3</version>
</dependency>



2.) modify my delegate to

package de.gravitex.bpmtest.processref.delegate.anothersimpleprocess;


import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.JavaDelegate;

public class AnotherDelegate implements JavaDelegate {

 
@Inject
 
BusinessLogicAdapter businessLogicAdapter;

 
 public void execute(DelegateExecution arg0) throws Exception {
 
System.out.println("...AnotherDelegate...");
 
}
}

But i can not find the '@Inject' annotation in that jar, so i can not compile/build the above code...shouldnt that annotation be in there?

Thanks,
Stefan

Stefan Schulz

unread,
Mar 11, 2014, 12:24:30 PM3/11/14
to camunda-...@googlegroups.com
Sorry....

i pointed out the wrong maven dependency...of course i added

<dependency>
   
<groupId>org.camunda.bpm</groupId>
   
<artifactId>camunda-engine-cdi</artifactId>
   
<version>7.1.0-alpha3</version>
</dependency>

to my project (and not just camunda-engine).

Stefan

Christian Lipphardt

unread,
Mar 11, 2014, 12:37:51 PM3/11/14
to camunda-...@googlegroups.com
Hi Stefan,

You have to add a dependency for Java EE API, eg

<dependency>
     <!-- Java EE 6 Specification -->
     <groupId>org.jboss.spec</groupId>
     <artifactId>jboss-javaee-web-6.0</artifactId>
     <version>2.0.0.Final</version>
     <type>pom</type>
     <scope>provided</scope>
   </dependency>


Cheers,
Christian

dinom...@gmail.com

unread,
Mar 13, 2014, 11:21:28 AM3/13/14
to camunda-...@googlegroups.com
Hi Christian

I am trying to call an EJB method directly from a process. I did everything as you mentioned above i.e.

- include camunda-engine-cdi maven dependency to your pom
- create a camunda.cfg.xml in your src/test/resources folder or bootstrap a process engine programmatically with a CdiStandaloneProcessEngineConfiguration.
- add a beans.xml to your META-INF

in the process I have the following serviceTask.


<bpmn2:serviceTask id="updateUser" name="updateUser"
camunda:expression="userService.updateUser()">
</bpmn2:serviceTask>



I have the UpdateUser class annotated with @Named as follows. Shouldn't the above service task call the CDI bean directly or I have to go through a java delegate class? At the moment it gives no error but the method updateUser() is not called.

@Named
@Stateless
public class UserService {

private final static Logger LOGGER = Logger.getLogger(UserService.class
.getName());

@Inject
@ProcessVariable
Object user;

public void updateUser() {
User myUser = (User) user;
LOGGER.log(Level.SEVERE, myUser.getName());

}

@PostConstruct
public void postContruct() {
LOGGER.log(Level.SEVERE, "TEST POST CONSTRUCT");
}

}

Can you please see what I am doing wrong?
thanks

Christian Lipphardt

unread,
Mar 13, 2014, 11:39:50 AM3/13/14
to camunda-...@googlegroups.com, dinom...@gmail.com
Hi,

Your setup looks ok, except try it with the correct JUEL expression -> hashtag + surrounding curly braces.


                   <bpmn2:serviceTask id="updateUser" name="updateUser"

                        camunda:expression="#{userService.updateUser()}">                        
                </bpmn2:serviceTask>                


Cheers,
Christian

Stefan Schulz

unread,
Mar 14, 2014, 3:07:56 AM3/14/14
to camunda-...@googlegroups.com
Hello, Christian.

I added that dependency and modified the code of my delegate to

package de.gravitex.bpmtest.processref.delegate.anothersimpleprocess;


import javax.inject.Inject;


import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.JavaDelegate;


import de.gravitex.bpmtest.ejb.BpmTest;



public class AnotherDelegate implements JavaDelegate {
 
 
@Inject

 
@MyAdapter
 
BpmTest bpmTest;

 
 
public void execute(DelegateExecution arg0) throws Exception {

 
System.out.println("Here is another delegate, i got injected : ["+bpmTest+"].");
 
}
}



BTW: Unlike above, i try to inject another ejb, because i got rid of my 'BusinessLogicAdapter' in order to reduce complexity of the example, but i think that should not make a difference.

The delegate is fired when executing the process, but the server trace i get when executing the process tells me that the 'bpmTest' variable is NULL. In Eclipse, i was facing a 'no bean is eligible for injection to the injection point', i fixed that by using a cdi qualifier (which makes the warning disappear):

package de.gravitex.bpmtest.ejb;


import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


import org.springframework.beans.factory.annotation.Qualifier;


import static java.lang.annotation.ElementType.*;


@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
@Qualifier
public @interface MyAdapter {

}


I use that qualifier (as you can see) at my injection point and to qualify the implementation of the ejb @Local interface which i try to inject.

To give an overview of what i did:

a.) I have a camunda bpm jboss (7.1.0-alpha3) up and running (i made no further configuration to it but installing a data source which i do not use in this context).
b.) I deployed a process using the tutorial under http://camunda.org/get-started/developing-process-applications.html, using a process class application for ejbs:

package de.gravitex.bpmtest.processref;


import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.ConcurrencyManagement;
import javax.ejb.ConcurrencyManagementType;
import javax.ejb.Local;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;


import org.camunda.bpm.application.ProcessApplication;
import org.camunda.bpm.application.ProcessApplicationInterface;
import org.camunda.bpm.application.impl.EjbProcessApplication;


@ProcessApplication("Reference Process Application")
@Singleton
@Startup
@ConcurrencyManagement(ConcurrencyManagementType.BEAN)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
@Local(ProcessApplicationInterface.class)
public class ReferenceProcessApplication extends EjbProcessApplication {


 
@PostConstruct
 
public void start() {
 deploy
();
 
System.out.println(" ------------------ DEPLOYED ------------------ ");
 
}


 
@PreDestroy
 
public void stop() {
 undeploy
();
 
System.out.println(" ------------------ UNDEPLOYED ------------------ ");
 
}
}

This seems to work as i can see the 'DEPLOYED' + 'DEPLOYED' sysos in my server trace.

c.) i deployed an ear with a stateless ejb in it which i can access from a client using RMI. 'BpmTest', which i try to inject in my delegate, is part of that deployment.

/********************EJB REMOTE INTERFACE******************************/


package de.gravitex.bpmtest.ejb;


import javax.ejb.Remote;


@Remote
public interface BpmTestRemote {


 
public void saySomething(String something);
}


/********************EJB LOCAL INTERFACE******************************/


package de.gravitex.bpmtest.ejb;


import javax.ejb.Local;


@Local
public interface BpmTest extends BpmTestRemote {


}


/********************IMPLEMENTATION******************************/


package de.gravitex.bpmtest.ejb;


import javax.ejb.Remote;
import javax.ejb.Stateless;


@Stateless(name = "BpmTest")
@Local(BpmTest.class)
@MyAdapter
public class BpmTestBean implements BpmTest {


 
public void saySomething(String something) {
 
System.out.println("saying something : " + something + ".");
 
}
}


d.) Then i try to inject the bean into my delegate. The POM of my project containing the process (and the delegate) looks like:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 
<modelVersion>4.0.0</modelVersion>
 
<groupId>de.gravitex.bpmtest</groupId>
 
<artifactId>bpm-process-ref</artifactId>
 
<version>1.0-SNAPSHOT</version>
 
<packaging>war</packaging>
 
<name>BPM Process Reference</name>


 
<dependencies>
 
<dependency>
 
<groupId>de.gravitex.bpmtest</groupId>
 
<artifactId>bpm-ejb</artifactId>
 
<version>1.0-SNAPSHOT</version>
 
</dependency>

 
<dependency>
 
<groupId>org.camunda.bpm</groupId>
 
<artifactId>camunda-engine-cdi</artifactId>
 
<version>7.1.0-alpha3</version>
 
</dependency>

 
<dependency>
 
<!-- Java EE 6 Specification -->
 
<groupId>org.jboss.spec</groupId>
 
<artifactId>jboss-javaee-web-6.0</artifactId>
 
<version>2.0.0.Final</version>
 
<type>pom</type>
 
<scope>provided</scope>
 
</dependency>

 
<dependency>
 
<groupId>org.camunda.bpm</groupId>
 
<artifactId>camunda-engine</artifactId>
 
<version>7.1.0-alpha3</version>
 
</dependency>

 
<dependency>
 
<groupId>javax.servlet</groupId>
 
<artifactId>javax.servlet-api</artifactId>
 
<version>3.0.1</version>
 
<scope>provided</scope>
 
</dependency>
 
</dependencies>


 
<build>
 
<plugins>
 
<plugin>
 
<groupId>org.apache.maven.plugins</groupId>
 
<artifactId>maven-war-plugin</artifactId>
 
<version>2.3</version>
 
<configuration>
 
<failOnMissingWebXml>false</failOnMissingWebXml>
 
</configuration>
 
</plugin>
 
<plugin>
 
<artifactId>maven-compiler-plugin</artifactId>
 
<configuration>
 
<source>1.7</source>
 
<target>1.7</target>
 
</configuration>
 
</plugin>
 
</plugins>
 
</build>


 
<repositories>
 
<repository>
 
<id>camunda-bpm-nexus</id>
 
<name>camunda-bpm-nexus</name>
 
<url>https://app.camunda.com/nexus/content/groups/public</url>
 
</repository>
 
</repositories>
</project>

'bpm-ejb' (see reference in the POM) is the project containing the EJB i try to inject.

The project is on github, if i forgot to point something out.


Perhaps this might be the point where i should think about some camunda 'Premium Consulting', as Jan Höppner offered me?
My feeling is that me problem gets too extensive to discuss it in this forum...a honest answer on that would be appreciated.

Thanks,
Stefan

dinom...@gmail.com

unread,
Mar 14, 2014, 4:50:14 AM3/14/14
to camunda-...@googlegroups.com
That fixed my issue Christian..thanks

Christian Lipphardt

unread,
Mar 14, 2014, 11:47:31 AM3/14/14
to camunda-...@googlegroups.com
Hi Stefan,

see my pull request https://github.com/gheddie/camunda_bpm_test/pull/1

Cheers,
Christian

Stefan Schulz

unread,
Mar 14, 2014, 3:45:40 PM3/14/14
to camunda-...@googlegroups.com
Hi, Christian.

Thank you very very much...ill try it out on monday when i am back in the office.

Stefan

Stefan Schulz

unread,
Mar 18, 2014, 12:11:02 PM3/18/14
to camunda-...@googlegroups.com
Hi, Christian.

Thanks again, the injection of my stateless session bean into the delegate code works fine now. Unfortunately, im running into another issue when i try use a jpa entity manager in the bean which i injected into the delegate in order to let my delegate code interact with a database.

In my github


is (again) my example project which works as we discussed so far. I can inject a stateless session bean

package de.gravitex.bpmtest.ejb;

import java.util.List;

import javax.ejb.Local;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import de.gravitex.bpmtest.ejb.entity.Customer;

@Stateless(name = "BLAdapter")
@Local(BLAdapter.class)
public class BLAdapterBean implements BLAdapter {
 
 
@PersistenceContext
 
EntityManager em;

 
@SuppressWarnings("unchecked")
 
public void invokeSomeBusinessLogic(String command) {
// System.out.println("bl command received : '" + command + "'.");
 
System.out.println("bl command received : " + command + ", my em is : "+em+".");
 
List<Customer> customers = em.createNamedQuery(Customer.FIND_ALL).getResultList();
 
System.out.println(customers.size() + " customers found.");
 
}
}


into one of my process delegates:

package de.gravitex.bpmtest.processref.delegate.anothersimpleprocess;

import javax.inject.Inject;
import javax.inject.Named;

import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.JavaDelegate;

import de.gravitex.bpmtest.ejb.BLAdapter;

@Named

public class AnotherDelegate implements JavaDelegate {
 
 
@Inject

 
BLAdapter blAdapter;

 
 
public void execute(DelegateExecution arg0) throws Exception {

 
System.out.println("Here is another delegate, i got injected : ["+blAdapter+"].");
 blAdapter
.invokeSomeBusinessLogic("here is some bl command from process delegate...");
 
}
}

If i just do the injection of the entity manager into the 'BLAdapterBean' (that means: if i DO NOT use the last two lines of the 'invokeSomeBusinessLogic' method in the injected ssb where i actually USE the entity manager), everything seems to work fine and my server console says:

bl command received : here is some bl command from process delegate..., my em is : org.jboss.as.jpa.container.TransactionScopedEntityManager@13c9ff8f.

But if i use the entity manager to do the named query, i get a very long exception:

16:16:48,911 ERROR [org.jboss.as.ejb3.invocation] (http-/127.0.0.1:3456-3) JBAS014134: EJB Invocation failed on component BLAdapter for method public abstract void de.gravitex.bpmtest.ejb.BLAdapter.invokeSomeBusinessLogic(java.lang.String): javax.ejb.EJBTransactionRolledbackException: org.hibernate.exception.GenericJDBCException: Could not open connection

 at org.jboss.as.ejb3.tx.CMTTxInterceptor.handleInCallerTx(CMTTxInterceptor.java:138) [jboss-as-ejb3-7.2.0.Final.jar:7.2.0.Final]
 at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInCallerTx(CMTTxInterceptor.java:228) [jboss-as-ejb3-7.2.0.Final.jar:7.2.0.Final]
 at org.jboss.as.ejb3.tx.CMTTxInterceptor.required(CMTTxInterceptor.java:317) [jboss-as-ejb3-7.2.0.Final.jar:7.2.0.Final]
 at org.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:214) [jboss-as-ejb3-7.2.0.Final.jar:7.2.0.Final]
 at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final]
 at org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation(CurrentInvocationContextInterceptor.java:41) [jboss-as-ejb3-7.2.0.Final.jar:7.2.0.Final]
 [...]
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Could not open connection
 at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1387) [hibernate-entitymanager-4.2.0.CR1.jar:4.2.0.CR1]
 at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1310) [hibernate-entitymanager-4.2.0.CR1.jar:4.2.0.CR1]
 at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:273) [hibernate-entitymanager-4.2.0.CR1.jar:4.2.0.CR1]
 at de.gravitex.bpmtest.ejb.BLAdapterBean.invokeSomeBusinessLogic(BLAdapterBean.java:23) [bpm-ejb-1.0-SNAPSHOT.jar:]
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_10]
 [...]
 ... 196 more
Caused by: org.hibernate.exception.GenericJDBCException: Could not open connection
 at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54) [hibernate-core-4.2.0.CR1.jar:4.2.0.CR1]
 at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125) [hibernate-core-4.2.0.CR1.jar:4.2.0.CR1]
 at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110) [hibernate-core-4.2.0.CR1.jar:4.2.0.CR1]
 at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:221) [hibernate-core-4.2.0.CR1.jar:4.2.0.CR1]
 at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:157) [hibernate-core-4.2.0.CR1.jar:4.2.0.CR1]
 at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.connection(StatementPreparerImpl.java:56) [hibernate-core-4.2.0.CR1.jar:4.2.0.CR1]
 [...]
 ... 228 more
Caused by: java.sql.SQLException: javax.resource.ResourceException: IJ000457: Unchecked throwable in managedConnectionReconnected() cl=org.jboss.jca.core.connectionmanager.listener.TxConnectionListener@32af45f2[state=NORMAL managed connection=org.jboss.jca.adapters.jdbc.local.LocalManagedConnection@62e37497 connection handles=0 lastUse=1395155808899 trackByTx=false pool=org.jboss.jca.core.connectionmanager.pool.strategy.OnePool@42fb9839 pool internal context=SemaphoreArrayListManagedConnectionPool@3fadcd60[pool=COREDBPOOL] xaResource=LocalXAResourceImpl@2b867a49[connectionListener=32af45f2 connectionManager=9c664f2 warned=false currentXid=null productName=Microsoft SQL Server productVersion=10.50.4000 jndiName=java:/COREDB] txSync=null]
 at org.jboss.jca.adapters.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:147)
 at org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider.getConnection(InjectedDataSourceConnectionProvider.java:70) [hibernate-entitymanager-4.2.0.CR1.jar:4.2.0.CR1]
 at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:292) [hibernate-core-4.2.0.CR1.jar:4.2.0.CR1]
 at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:214) [hibernate-core-4.2.0.CR1.jar:4.2.0.CR1]
 ... 248 more
Caused by: javax.resource.ResourceException: IJ000457: Unchecked throwable in managedConnectionReconnected() cl=org.jboss.jca.core.connectionmanager.listener.TxConnectionListener@32af45f2[state=NORMAL managed connection=org.jboss.jca.adapters.jdbc.local.LocalManagedConnection@62e37497 connection handles=0 lastUse=1395155808899 trackByTx=false pool=org.jboss.jca.core.connectionmanager.pool.strategy.OnePool@42fb9839 pool internal context=SemaphoreArrayListManagedConnectionPool@3fadcd60[pool=COREDBPOOL] xaResource=LocalXAResourceImpl@2b867a49[connectionListener=32af45f2 connectionManager=9c664f2 warned=false currentXid=null productName=Microsoft SQL Server productVersion=10.50.4000 jndiName=java:/COREDB] txSync=null]
 at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.reconnectManagedConnection(AbstractConnectionManager.java:604)
 at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.allocateConnection(AbstractConnectionManager.java:467)
 at org.jboss.jca.adapters.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:139)
 ... 251 more
Caused by: javax.resource.ResourceException: IJ000461: Could not enlist in transaction on entering meta-aware object
 at org.jboss.jca.core.connectionmanager.tx.TxConnectionManagerImpl.managedConnectionReconnected(TxConnectionManagerImpl.java:474)
 at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.reconnectManagedConnection(AbstractConnectionManager.java:599)
 ... 253 more
Caused by: javax.transaction.SystemException: IJ000356: Failed to enlist: java.lang.Throwable: Unabled to enlist resource, see the previous warnings. tx=TransactionImple < ac, BasicAction: 0:ffff0acf017a:-76a43801:5328634a:13c status: ActionStatus.ABORT_ONLY >
 at org.jboss.jca.core.connectionmanager.listener.TxConnectionListener$TransactionSynchronization.checkEnlisted(TxConnectionListener.java:552)
 at org.jboss.jca.core.connectionmanager.listener.TxConnectionListener.enlist(TxConnectionListener.java:282)
 at org.jboss.jca.core.connectionmanager.tx.TxConnectionManagerImpl.managedConnectionReconnected(TxConnectionManagerImpl.java:467)
 ... 254 more
16:16:49,222 SEVERE [org.camunda.bpm.engine.impl.interceptor.CommandContext] (http-/
127.0.0.1:3456-3) Error while closing command context: javax.ejb.EJBTransactionRolledbackException: org.hibernate.exception.GenericJDBCException: Could not open connection
 at org
.jboss.as.ejb3.tx.CMTTxInterceptor.handleInCallerTx(CMTTxInterceptor.java:138) [jboss-as-ejb3-7.2.0.Final.jar:7.2.0.Final]
 at org
.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInCallerTx(CMTTxInterceptor.java:228) [jboss-as-ejb3-7.2.0.Final.jar:7.2.0.Final]
 at org
.jboss.as.ejb3.tx.CMTTxInterceptor.required(CMTTxInterceptor.java:317) [jboss-as-ejb3-7.2.0.Final.jar:7.2.0.Final]
 at org
.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:214) [jboss-as-ejb3-7.2.0.Final.jar:7.2.0.Final]
 
[...]
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Could not open connection
 at org
.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1387)
 at org
.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1310)
 at org
.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:273)
 at de
.gravitex.bpmtest.ejb.BLAdapterBean.invokeSomeBusinessLogic(BLAdapterBean.java:23)
 at sun
.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_10]
 
[...]
 
... 196 more
Caused by: org.hibernate.exception.GenericJDBCException: Could not open connection
 at org
.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54)
 at org
.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
 at org
.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
 at org
.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:221)
 at org
.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:157)
 
[...]
 
... 228 more
Caused by: java.sql.SQLException: javax.resource.ResourceException: IJ000457: Unchecked throwable in managedConnectionReconnected() cl=org.jboss.jca.core.connectionmanager.listener.TxConnectionListener@32af45f2[state=NORMAL managed connection=org.jboss.jca.adapters.jdbc.local.LocalManagedConnection@62e37497 connection handles=0 lastUse=1395155808899 trackByTx=false pool=org.jboss.jca.core.connectionmanager.pool.strategy.OnePool@42fb9839 pool internal context=SemaphoreArrayListManagedConnectionPool@3fadcd60[pool=COREDBPOOL] xaResource=LocalXAResourceImpl@2b867a49[connectionListener=32af45f2 connectionManager=9c664f2 warned=false currentXid=null productName=Microsoft SQL Server productVersion=10.50.4000 jndiName=java:/COREDB] txSync=null]
 at org.jboss.jca.adapters.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:147)
 at org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider.getConnection(InjectedDataSourceConnectionProvider.java:70)
 at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:292)
 at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:214)
 ... 248 more
Caused by: javax.resource.ResourceException: IJ000457: Unchecked throwable in managedConnectionReconnected() cl=org.jboss.jca.core.connectionmanager.listener.TxConnectionListener@32af45f2[state=NORMAL managed connection=org.jboss.jca.adapters.jdbc.local.LocalManagedConnection@62e37497 connection handles=0 lastUse=1395155808899 trackByTx=false pool=org.jboss.jca.core.connectionmanager.pool.strategy.OnePool@42fb9839 pool internal context=SemaphoreArrayListManagedConnectionPool@3fadcd60[pool=COREDBPOOL] xaResource=LocalXAResourceImpl@2b867a49[connectionListener=32af45f2 connectionManager=9c664f2 warned=false currentXid=null productName=Microsoft SQL Server productVersion=10.50.4000 jndiName=java:/COREDB] txSync=null]
 at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.reconnectManagedConnection(AbstractConnectionManager.java:604)
 at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.allocateConnection(AbstractConnectionManager.java:467)
 at org.jboss.jca.adapters.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:139)
 ... 251 more
Caused by: javax.resource.ResourceException: IJ000461: Could not enlist in transaction on entering meta-aware object
 at org.jboss.jca.core.connectionmanager.tx.TxConnectionManagerImpl.managedConnectionReconnected(TxConnectionManagerImpl.java:474)
 at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.reconnectManagedConnection(AbstractConnectionManager.java:599)
 ... 253 more
Caused by: javax.transaction.SystemException: IJ000356: Failed to enlist: java.lang.Throwable: Unabled to enlist resource, see the previous warnings. tx=TransactionImple < ac, BasicAction: 0:ffff0acf017a:-76a43801:5328634a:13c status: ActionStatus.ABORT_ONLY >
 at org.jboss.jca.core.connectionmanager.listener.TxConnectionListener$TransactionSynchronization.checkEnlisted(TxConnectionListener.java:552)
 at org.jboss.jca.core.connectionmanager.listener.TxConnectionListener.enlist(TxConnectionListener.java:282)
 at org.jboss.jca.core.connectionmanager.tx.TxConnectionManagerImpl.managedConnectionReconnected(TxConnectionManagerImpl.java:467)
 ... 254 more
16:16:49,533 WARNING [ExceptionHandler] (http-/
127.0.0.1:3456-3) javax.ejb.EJBTransactionRolledbackException: org.hibernate.exception.GenericJDBCException: Could not open connection
 at org
.jboss.as.ejb3.tx.CMTTxInterceptor.handleInCallerTx(CMTTxInterceptor.java:138)
 at org
.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInCallerTx(CMTTxInterceptor.java:228)
 at org
.jboss.as.ejb3.tx.CMTTxInterceptor.required(CMTTxInterceptor.java:317)
 at org
.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:214)
 at org
.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
 at org
.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation(CurrentInvocationContextInterceptor.java:41)
 
[...]
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Could not open connection
 at org
.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1387)
 at org
.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1310)
 at org
.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:273)
 at de
.gravitex.bpmtest.ejb.BLAdapterBean.invokeSomeBusinessLogic(BLAdapterBean.java:23)
 at sun
.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 
[...]
 
... 196 more
Caused by: org.hibernate.exception.GenericJDBCException: Could not open connection
 at org
.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54)
 at org
.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
 at org
.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
 at org
.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:221)
 at org
.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:157)
 
[...]
 
... 228 more
Caused by: java.sql.SQLException: javax.resource.ResourceException: IJ000457: Unchecked throwable in managedConnectionReconnected() cl=org.jboss.jca.core.connectionmanager.listener.TxConnectionListener@32af45f2[state=NORMAL managed connection=org.jboss.jca.adapters.jdbc.local.LocalManagedConnection@62e37497 connection handles=0 lastUse=1395155808899 trackByTx=false pool=org.jboss.jca.core.connectionmanager.pool.strategy.OnePool@42fb9839 pool internal context=SemaphoreArrayListManagedConnectionPool@3fadcd60[pool=COREDBPOOL] xaResource=LocalXAResourceImpl@2b867a49[connectionListener=32af45f2 connectionManager=9c664f2 warned=false currentXid=null productName=Microsoft SQL Server productVersion=10.50.4000 jndiName=java:/COREDB] txSync=null]
 at org
.jboss.jca.adapters.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:147)
 at org
.hibernate.ejb.connection.InjectedDataSourceConnectionProvider.getConnection(InjectedDataSourceConnectionProvider.java:70)
 at org
.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:292)
 at org
.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:214)
 
... 248 more
Caused by: javax.resource.ResourceException: IJ000457: Unchecked throwable in managedConnectionReconnected() cl=org.jboss.jca.core.connectionmanager.listener.TxConnectionListener@32af45f2[state=NORMAL managed connection=org.jboss.jca.adapters.jdbc.local.LocalManagedConnection@62e37497 connection handles=0 lastUse=1395155808899 trackByTx=false pool=org.jboss.jca.core.connectionmanager.pool.strategy.OnePool@42fb9839 pool internal context=SemaphoreArrayListManagedConnectionPool@3fadcd60[pool=COREDBPOOL] xaResource=LocalXAResourceImpl@2b867a49[connectionListener=32af45f2 connectionManager=9c664f2 warned=false currentXid=null productName=Microsoft SQL Server productVersion=10.50.4000 jndiName=java:/COREDB] txSync=null]
 at org
.jboss.jca.core.connectionmanager.AbstractConnectionManager.reconnectManagedConnection(AbstractConnectionManager.java:604)
 at org
.jboss.jca.core.connectionmanager.AbstractConnectionManager.allocateConnection(AbstractConnectionManager.java:467)
 at org
.jboss.jca.adapters.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:139)
 
... 251 more
Caused by: javax.resource.ResourceException: IJ000461: Could not enlist in transaction on entering meta-aware object
 at org
.jboss.jca.core.connectionmanager.tx.TxConnectionManagerImpl.managedConnectionReconnected(TxConnectionManagerImpl.java:474)
 at org
.jboss.jca.core.connectionmanager.AbstractConnectionManager.reconnectManagedConnection(AbstractConnectionManager.java:599)
 
... 253 more
Caused by: javax.transaction.SystemException: IJ000356: Failed to enlist: java.lang.Throwable: Unabled to enlist resource, see the previous warnings. tx=TransactionImple < ac, BasicAction: 0:ffff0acf017a:-76a43801:5328634a:13c status: ActionStatus.ABORT_ONLY >
 at org
.jboss.jca.core.connectionmanager.listener.TxConnectionListener$TransactionSynchronization.checkEnlisted(TxConnectionListener.java:552)
 at org
.jboss.jca.core.connectionmanager.listener.TxConnectionListener.enlist(TxConnectionListener.java:282)
 at org
.jboss.jca.core.connectionmanager.tx.TxConnectionManagerImpl.managedConnectionReconnected(TxConnectionManagerImpl.java:467)
 
... 254 more

My datasource itself works, as i can use an injected entity manager in another ssb ('EngineProviderBean') i trigger by RMI from my client. It seems as if im facing some issues with the jboss 7.2.0...do you have any experience with that or an idea how i can handle them?

Thanks,
Stefan

Christian Lipphardt

unread,
Mar 19, 2014, 6:16:25 AM3/19/14
to camunda-...@googlegroups.com
Hi Stefan,

Could you please post your JBoss standalone.xml with the datasource / camunda subsystem configuration?

Cheers,
Christian

Stefan Schulz

unread,
Mar 19, 2014, 6:46:54 AM3/19/14
to camunda-...@googlegroups.com
Hi, Christian...

Here it is...

Thanks,
Stefan
standalone.xml

Christian Lipphardt

unread,
Mar 19, 2014, 8:52:39 AM3/19/14
to camunda-...@googlegroups.com
Hi Stefan,

When you use two datasources (JPA + camunda BPM) which participate in a single transaction (the engine does when used in an application server.), both datasources must be configured as XA datasources.
I was able to reproduce the error by replacing your mssql datasource with a h2 one.
When I reconfigured both datasources to xa ones, the process worked fine.

Cheers,
Christian

Stefan Schulz

unread,
Mar 19, 2014, 10:28:29 AM3/19/14
to camunda-...@googlegroups.com
Hi, Christian.

Thank you, we will check that. Do you still have your standalone.xml file  where you made your changes so that we could have a look? We tried several examples from google on how to configure a xa datasource in JBoss 7.2.0., but so far, we did not have any luck.

Cheers,
Stefan

Christian Lipphardt

unread,
Mar 19, 2014, 10:47:09 AM3/19/14
to camunda-...@googlegroups.com
Hi Stefan,

We configure MSSQL XA datasources like

<datasources>
   
<xa-datasource jta="true" jndi-name="java:/COREDB" enabled="true" use-ccm="false" pool-name="COREDBPOOL">
     
<xa-datasource-property name="URL">jdbc:sqlserver://${database.host}</xa-datasource-property>
     
<xa-datasource-property name="PortNumber">1433</xa-datasource-property>
     
<xa-datasource-property name="DatabaseName">${database.name}</xa-datasource-property>
     
<xa-datasource-property name="User">${database.user}</xa-datasource-property>
     
<xa-datasource-property name="password">${database.password}</xa-datasource-property>
     
<driver>com.microsoft.sqlserver</driver>
     
<validation>
       
<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLValidConnectionChecker"></valid-connection-checker>
     
</validation>
   
</xa-datasource>
   
<xa-datasource jta="true" jndi-name="java:jboss/datasources/ProcessEngine" enabled="true" use-ccm="false" pool-name="ProcessEngine">
     
<xa-datasource-property name="URL">jdbc:sqlserver://${database.host}</xa-datasource-property>
     
<xa-datasource-property name="PortNumber">1433</xa-datasource-property>
     
<xa-datasource-property name="DatabaseName">${database.name}</xa-datasource-property>
     
<xa-datasource-property name="User">${database.user}</xa-datasource-property>
     
<xa-datasource-property name="password">${database.password}</xa-datasource-property>
     
<driver>com.microsoft.sqlserver</driver>
     
<validation>
       
<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLValidConnectionChecker"></valid-connection-checker>
     
</validation>
   
</xa-datasource>
</datasources>

To add more configuration features like statement tracking etc see ${CAMUNDA_HOME}/jboss-as-7.2.0.Final/docs/schema/jboss-as-datasources_1_1.xsd for valid configuration schema of XA datasource.

Hint: We use the official MS driver, not the JTDS one.

Cheers,
Christian

Stefan Schulz

unread,
Mar 19, 2014, 11:01:07 AM3/19/14
to camunda-...@googlegroups.com
Hi, Christian.

Jippie....it works!! Thank you very much!

Cheers,
Stefan
Reply all
Reply to author
Forward
0 new messages