cancel
Showing results for 
Search instead for 
Did you mean: 

Using Activiti in an JEE environment

chris_joelly
Champ in-the-making
Champ in-the-making
Hello,

i just try to figure out how to use Activiti engine in an JEE application running on an JEE server.

The server in question is Apache Geronimo which provides things like JPA and JSF, which i want
to use for an application, and for some parts of that application i want to use Activiti as process
engine.

I read through the Activiti documentation regarding some topics and the following questions arose
which i can not answer myself from the documentation, and trying all seems to be some effort so
if anybody has experience or knowledge about this issues i would be very glad to hear about it Smiley Happy

How can i initialize and start the process engine in an JEE/EAR based application? In JEE6 there is
a new type of session bean, singleton session bean which may be used for this issue. But what in
an JEE5 environment? Is there something similar?

Activiti is able to use JPA driven entities as process variables, but how needs Activiti to be configured
to use a datasource provided by the JEE server? Within an EJB module a persistence.xml needs to
be provided which configures JPA and a datasource can be referenced which is provided by the
JEE server. When Activiti is configured with a persistence unit from that persistence.xml, is this
sufficient for Activiti to be able to use the JPA driven entities from the EJB module?

Activiti is distributed with various tools like Explorer which provides a frontend to the tasks created
using the life time of a process. Can the process engine and the processes and tasks be managed
without Explorer, e.g. when building an own user interface around the Activiti engine? Is the REST
interface of Activiti the interface for such integration?

What about CDI? This is only available in JEE6 environments? Can this solve the initialization and
starting of the process engine with the @Inject ProcessEngine annotation? And are the JPA,
datasource, transaction and persistence unit issues too solvable using CDI in an JEE6 environment?

Thanks for any answer

Chris
15 REPLIES 15

ronald_van_kuij
Champ on-the-rise
Champ on-the-rise
Is there something similar?
A good old startup servlet?

When Activiti is configured with a persistence unit from that persistence.xml, is this sufficient for Activiti to be able to use the JPA driven entities from the EJB module?
I think so, have not used it myself.

but how needs Activiti to be configured to use a datasource provided by the JEE server?
See here

Can the process engine and the processes and tasks be managed without Explorer, e.g. when building an own user interface around the Activiti engine?
Sure, Activiti core is basically a jar with a java api

Is the REST interface of Activiti the interface for such integration?
I would not use that if you think JSF… use the java api, much, much easier, typesafe, performant etc…

What about CDI?
Even better

This is only available in JEE6 environments?
It is present by default in JEE6, but just add some jars to JEE5 and it works great.

i think you can help  me  im working with activiti and jsf page  i start my process 

the problem is when i go to the first user  task and i try to complet task with this instruction

#{businessProcess.completeTask(true)} i have this error  no task associed call start task before 

this error  come cause the ID  of the current task is nullif you can help me pleas  tel me  

#HELP

chris_joelly
Champ in-the-making
Champ in-the-making
Is there something similar?
A good old startup servlet?
ok, i switched to JEE6 for that project and use a singleton session bean for that issue.
i provided the activiti jars in the webapps pom and added the following activiti.cfg.xml to the WEB-INF directory:


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="
  http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">
<jee:jndi-lookup jndi-name="java:TestErp" id="dataSource" />
<bean id="processEngineConfiguration"
  class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
  <property name="dataSource" ref="dataSource" />
  <property name="databaseSchemaUpdate" value="true" />
  <property name="jobExecutorActivate" value="false" />
</bean>
</beans>
unfortunately i dont get a process engine using the following code in the constructor of the singleton session bean:

/**
* Session Bean implementation class ActivitiStarter
*/
@Singleton
@LocalBean
public class ActivitiStarter {

    ProcessEngine processEngine = null;

    /**
     * Default constructor.
     */
    public ActivitiStarter() {
     processEngine = ProcessEngines.getDefaultProcessEngine();
    }

}

What about CDI?
Even better

i added activiti-cdi to my pom and added a bean.xml with the following content:


<?xml version="1.0" encoding="ISO-8859-1"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
      http://java.sun.com/xml/ns/javaee
      http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">

  <alternatives>
        <class>org.activiti.cdi.impl.LocalProcessEngineLookup</class>
  </alternatives>

</beans>

but when i deploy the webapp to glassfish i get the following exception:


SCHWERWIEGEND: Exception while loading the app
SCHWERWIEGEND: Exception while loading the app : Exception List with 1 exceptions:
Exception 0 :
java.util.NoSuchElementException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:796)
at java.util.HashMap$KeyIterator.next(HashMap.java:828)
at org.activiti.cdi.impl.util.ProgrammaticBeanLookup.lookup(ProgrammaticBeanLookup.java:29)
at org.activiti.cdi.impl.ActivitiExtension.initializeProcessEngine(ActivitiExtension.java:83)
at org.activiti.cdi.impl.ActivitiExtension.afterDeploymentValidation(ActivitiExtension.java:69)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.jboss.weld.util.reflection.SecureReflections$13.work(SecureReflections.java:305)
at org.jboss.weld.util.reflection.SecureReflectionAccess.run(SecureReflectionAccess.java:54)
at org.jboss.weld.util.reflection.SecureReflectionAccess.runAsInvocation(SecureReflectionAccess.java:163)
at org.jboss.weld.util.reflection.SecureReflections.invoke(SecureReflections.java:299)
at org.jboss.weld.introspector.jlr.WeldMethodImpl.invokeOnInstance(WeldMethodImpl.java:188)
at org.jboss.weld.introspector.ForwardingWeldMethod.invokeOnInstance(ForwardingWeldMethod.java:59)
at org.jboss.weld.injection.MethodInjectionPoint.invokeOnInstanceWithSpecialValue(MethodInjectionPoint.java:198)
at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:270)
at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:253)
at org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:222)
at org.jboss.weld.bootstrap.events.AbstractContainerEvent.fire(AbstractContainerEvent.java:88)
at org.jboss.weld.bootstrap.events.AbstractDeploymentContainerEvent.fire(AbstractDeploymentContainerEvent.java:52)
at org.jboss.weld.bootstrap.events.AfterDeploymentValidationImpl.fire(AfterDeploymentValidationImpl.java:34)
at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:393)
at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:190)
at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:128)
at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:298)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:461)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240)
at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:370)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:355)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:370)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1067)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:96)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1247)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1235)
at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:465)
at com.sun.enterprise.v3.admin.AdminAdapter.service(AdminAdapter.java:222)
at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:168)
at com.sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:117)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:234)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:822)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:719)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1013)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
at java.lang.Thread.run(Thread.java:662)

does this happen because activiti-cdi can not find a process engine?

chris_joelly
Champ in-the-making
Champ in-the-making
i found some issues:

first the activity.cfg.xml was not in the classpath, and then i found in the docs that i need to execute ProcessEngines.init() and ProcessEngines.destroy() to start and stop the engine. Smiley Happy

then it seems that i used a wrong schemaLocation for the jee namespace in the activiti.cfg.xml. i corrected the namespace, but i still get the following exception when the Activiti engine initializes:


INFO: initializing process engine for resource file:/data/Projects/JavaLibs/glassfish/glassfish3/glassfish/domains/domain1/eclipseApps/erp.web/WEB-INF/classes/activiti.cfg.xml
INFO: Loading XML bean definitions from resource loaded through InputStream

SCHWERWIEGEND: Exception while initializing process engine :Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/jee]
Offending resource: resource loaded through InputStream
org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/jee]
Offending resource: resource loaded through InputStream
at org.springframework.beans.factory.parsing.FailFastProblemReporter.error(FailFastProblemReporter.java:68)
at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:85)
at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:80)
at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.error(BeanDefinitionParserDelegate.java:284)
at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1332)
at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1325)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:135)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:93)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
at org.activiti.engine.impl.cfg.BeansConfigurationHelper.parseProcessEngineConfiguration(BeansConfigurationHelper.java:35)
at org.activiti.engine.impl.cfg.BeansConfigurationHelper.parseProcessEngineConfigurationFromInputStream(BeansConfigurationHelper.java:43)
at org.activiti.engine.ProcessEngineConfiguration.createProcessEngineConfigurationFromInputStream(ProcessEngineConfiguration.java:163)
at org.activiti.engine.ProcessEngineConfiguration.createProcessEngineConfigurationFromInputStream(ProcessEngineConfiguration.java:159)
at org.activiti.engine.ProcessEngines.buildProcessEngine(ProcessEngines.java:176)
at org.activiti.engine.ProcessEngines.initProcessEnginFromResource(ProcessEngines.java:150)
at org.activiti.engine.ProcessEngines.init(ProcessEngines.java:88)
at com.examples.ejbeans.ActivitiStarter.initEngine(ActivitiStarter.java:30)

it seems that i have some problems getting the activiti.cfg.xml file correct so that i can use jee:jndi-lookup:


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd">

<jee:jndi-lookup jndi-name="jdbc/MysqlErp" id="dataSource" />

<bean id="processEngineConfiguration"
  class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
  <property name="dataSource" ref="dataSource" />
  <property name="databaseSchemaUpdate" value="true" />
  <property name="databaseType" value="mysql" />
  <property name="jobExecutorActivate" value="false" />
</bean>
</beans>

can somebody point me to the problems i have? in my classpath i only have the dependencies which maven adds via activiti-engine, maybe i need another spring module for this to work correct?

thanks,

Chris

p4w3l
Champ in-the-making
Champ in-the-making
Hi, I am not Spring expert but just copied activiti.cfg.xml from Manual and it works fine for me! Go to "Creating a ProcessEngine" in manual and you are done!

Somebody can tell me if following call in every JSF's backing bean's constructor that need process engine is a bad practise?:

processEngine = ProcessEngines.getDefaultProcessEngine();

chris_joelly
Champ in-the-making
Champ in-the-making
Hi, I am not Spring expert but just copied activiti.cfg.xml from Manual and it works fine for me! Go to "Creating a ProcessEngine" in manual and you are done!

Somebody can tell me if following call in every JSF's backing bean's constructor that need process engine is a bad practise?:

processEngine = ProcessEngines.getDefaultProcessEngine();
my issue is related to the jee: namespace because i want/need to lookup a datasource from the JEE container via JNDI.
so just copying the sample cfg.xml is not enough.

unfortunately i am not able to see the problem, even if i debug the code creating a processengine from the activiti.cfg.xml.

ronald_van_kuij
Champ on-the-rise
Champ on-the-rise
what does the spring forum say about this? Sounds like some jar is missing, but I'm not only not a spring expert, I'm not a spring user at all, so could not help you in detail

chris_joelly
Champ in-the-making
Champ in-the-making
what does the spring forum say about this? Sounds like some jar is missing, but I'm not only not a spring expert, I'm not a spring user at all, so could not help you in detail
i managed to find the neccessary sping dependency: it is spring-context, there the needed xsd is available.

thanks

chris_joelly
Champ in-the-making
Champ in-the-making
finally Activitiy is able to create the needed tables in the MySql database, but i get the following exception:


javax.resource.spi.LocalTransactionException: Can't call commit when autocommit=true
at com.sun.gjc.spi.LocalTransaction.commit(LocalTransaction.java:112)
at com.sun.enterprise.resource.ConnectorXAResource.commit(ConnectorXAResource.java:124)
at com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:503)
at com.sun.enterprise.transaction.JavaEETransactionManagerSimplified.commit(JavaEETransactionManagerSimplified.java:867)
at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:5115)
at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4894)
at com.sun.ejb.containers.AbstractSingletonContainer.createSingletonEJB(AbstractSingletonContainer.java:555)
at com.sun.ejb.containers.AbstractSingletonContainer.access$100(AbstractSingletonContainer.java:79)
at com.sun.ejb.containers.AbstractSingletonContainer$SingletonContextFactory.create(AbstractSingletonContainer.java:717)
at com.sun.ejb.containers.AbstractSingletonContainer.instantiateSingletonInstance(AbstractSingletonContainer.java:449)
at org.glassfish.ejb.startup.SingletonLifeCycleManager.initializeSingleton(SingletonLifeCycleManager.java:216)
at org.glassfish.ejb.startup.SingletonLifeCycleManager.initializeSingleton(SingletonLifeCycleManager.java:177)
at org.glassfish.ejb.startup.SingletonLifeCycleManager.doStartup(SingletonLifeCycleManager.java:155)
at org.glassfish.ejb.startup.EjbApplication.start(EjbApplication.java:177)
at org.glassfish.internal.data.EngineRef.start(EngineRef.java:130)
at org.glassfish.internal.data.ModuleInfo.start(ModuleInfo.java:269)
at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:286)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:461)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240)
at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:370)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:355)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:370)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1067)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:96)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1247)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1235)
at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:465)
at com.sun.enterprise.v3.admin.AdminAdapter.service(AdminAdapter.java:222)
at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:168)
at com.sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:117)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:234)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:822)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:719)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1013)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
at java.lang.Thread.run(Thread.java:662)
Caused by: java.sql.SQLException: Can't call commit when autocommit=true
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:930)
at com.mysql.jdbc.ConnectionImpl.commit(ConnectionImpl.java:1602)
at com.sun.gjc.spi.LocalTransaction.commit(LocalTransaction.java:106)
… 44 more

i assume this is related to the datasource configuration in Glassfish, but i did not find a property
to disable autocommit on the JDBC connection pool nor on the JDBC resource.

I saw in the user guide of Activiti that it is possible to disable autocommit on an datasource
which is configured through an e.g. DBCP datasource. So.. i think i can not disable it when i
lookup the datasource via JNDI in activiti.cfg.xml and inject it into the engine configuration?