java.lang.LinkageError with Spring and Shared Container Managed Process Engine

211 views
Skip to first unread message

masroo...@gmail.com

unread,
Jan 13, 2014, 5:19:19 AM1/13/14
to camunda-...@googlegroups.com
Hello together,
after playing around with camunda BPM platform and spring integration I am finally obeserving an error which only occurs when I try to deploy a newer version of the same process app (production use case). My question is, did I miss something important or does the camunda BPM does not support such an approach?

SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'processEngine': FactoryBean threw exception on object creation; nested exception is java.lang.LinkageError: loader constraint violation: when resolving method "org.camunda.bpm.engine.impl.cfg.SpringBeanFactoryProxyMap.<init>(Lorg/springframework/beans/factory/BeanFactory;)V" the class loader (instance of org/apache/catalina/loader/WebappClassLoader) of the current class, org/camunda/bpm/engine/spring/ProcessEngineFactoryBean, and the class loader (instance of org/apache/catalina/loader/StandardClassLoader) for resolved class, org/camunda/bpm/engine/impl/cfg/SpringBeanFactoryProxyMap, have different Class objects for the type p used in the signature
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:149)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:102)
at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1442)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:248)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)


1. I have a process application with a few delegates and its dependencies:

<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/maven-v4_0_0.xsd">
...
<packaging>war</packaging>
<version>3.0</version>

<properties>
<spring.version>3.1.2.RELEASE</spring.version>
<camunda.version>7.1.0-alpha1</camunda.version>
</properties>

<dependencies>
<dependency>
<groupId>org.camunda.bpm</groupId>
<artifactId>camunda-engine</artifactId>
<version>${camunda.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.camunda.bpm</groupId>
<artifactId>camunda-engine-spring</artifactId>
<version>${camunda.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
...

2. I'd like the Spring IoC container handle the process engine creation and the other configuration stuff. Anyhow the configuration looks like this:

<?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:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd">


<bean id="dataSource"
class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
<property name="targetDataSource">
<bean class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
<property name="driverClass" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
</property>
</bean>

<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>

<bean id="processEngineConfiguration" class="org.camunda.bpm.engine.spring.SpringProcessEngineConfiguration">
<property name="processEngineName" value="myprocessengine" />
<property name="databaseType" value="${db}" />
<property name="history" value="full" />
<property name="dataSource" ref="dataSource" />
<property name="transactionManager" ref="txManager" />
<property name="databaseSchemaUpdate" value="true" />
<property name="jobExecutorActivate" value="true" />
<property name="jobExecutor" ref="jobExecutor"/>
<property name="deploymentResources">
<list>
<value>classpath*:/*.bpmn20</value>
<value>classpath*:/*.png</value>
<value>classpath*:/*.bpmn</value>
</list>
</property>
</bean>

<bean id="jobExecutor" class="org.camunda.bpm.engine.impl.jobexecutor.DefaultJobExecutor">
<property name="lockTimeInMillis" value="3600000"/>
</bean>

<bean id="processEngine" class="org.camunda.bpm.engine.spring.container.ManagedProcessEngineFactoryBean"
destroy-method="destroy">
<property name="processEngineConfiguration" ref="processEngineConfiguration" />
</bean>

<!-- Activiti Services -->
<bean id="repositoryService" factory-bean="processEngine"
factory-method="getRepositoryService" />
<bean id="runtimeService" factory-bean="processEngine"
factory-method="getRuntimeService" />
<bean id="taskService" factory-bean="processEngine"
factory-method="getTaskService" />
<bean id="historyService" factory-bean="processEngine"
factory-method="getHistoryService" />
<bean id="managementService" factory-bean="processEngine"
factory-method="getManagementService" />
<bean id="identityService" factory-bean="processEngine"
factory-method="getIdentityService" />

...

</beans>

And finally the process app class and processes.xml:

@ProcessApplication("My Process Application")
public class MyProcessApp extends SpringServletProcessApplication {}

<?xml version="1.0" encoding="UTF-8" ?>

<process-application
xmlns="http://www.camunda.org/schema/1.0/ProcessApplication"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<process-archive name="my-process-archive">
<process-engine>my-processengine</process-engine>
<properties>
<property name="isDeleteUponUndeploy">true</property>
<property name="isScanForProcessDefinitions">true</property>
</properties>
</process-archive>

</process-application>

Kind Regards
Masroor

Roman Smirnov

unread,
Jan 13, 2014, 8:02:52 AM1/13/14
to camunda-...@googlegroups.com, masroo...@gmail.com
Hi Masroor,

I was able to reproduce the exception on tomcat. It seems to be a bug, so I create an issue CAM-1699.


Cheers,
Roman

masroo...@gmail.com

unread,
Jan 13, 2014, 9:44:04 AM1/13/14
to camunda-...@googlegroups.com, masroo...@gmail.com
Hi Roman,
Great! Thanks for the quick response. :-)
Cheers, Masroor

venkataraju...@gmail.com

unread,
Feb 4, 2016, 1:37:45 AM2/4/16
to camunda BPM users
if use
<bean id="processEngine" class="org.camunda.bpm.engine.spring.ProcessEngineFactoryBean">

<property name="processEngineConfiguration" ref="processEngineConfiguration" />
</bean>

instead of ManagedProcessEngineFactoryBean, it works.
And need to add ProcessEngineRule, if using junit4.
<bean id="processEngineRule" class="org.camunda.bpm.engine.test.ProcessEngineRule">
<property name="processEngine" ref="processEngine" />
</bean>

venkataraju...@gmail.com

unread,
Feb 4, 2016, 1:41:30 AM2/4/16
to camunda BPM users

This is my applicationContext.xml file

xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd" >


<bean id="dataSource" class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
<property name="targetDataSource">
<bean class="org.springframework.jdbc.datasource.SimpleDriverDataSource">

<property name="driverClass" value="org.h2.Driver" />
<property name="url" value="jdbc:h2:mem:process-engine;DB_CLOSE_DELAY=1000" />
<property name="username" value="sa" />
<property name="password" value="" />
</bean>
</property>
</bean>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">


<property name="dataSource" ref="dataSource" />
</bean>

<bean id="processEngineConfiguration" class="org.camunda.bpm.engine.spring.SpringProcessEngineConfiguration">

<property name="processEngineName" value="engine" />


<property name="dataSource" ref="dataSource" />

<property name="transactionManager" ref="transactionManager" />


<property name="databaseSchemaUpdate" value="true" />

<property name="jobExecutorActivate" value="false" />
<property name="deploymentResources" value="classpath*:*.bpmn" />
</bean>

<bean id="processEngine" class="org.camunda.bpm.engine.spring.ProcessEngineFactoryBean">


<property name="processEngineConfiguration" ref="processEngineConfiguration" />
</bean>

<bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService" />


<bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService" />
<bean id="taskService" factory-bean="processEngine" factory-method="getTaskService" />
<bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService" />
<bean id="managementService" factory-bean="processEngine" factory-method="getManagementService" />

<bean id="processEngineRule" class="org.camunda.bpm.engine.test.ProcessEngineRule">


<property name="processEngine" ref="processEngine" />
</bean>

<context:annotation-config />
<bean class="com.att.oce.bpm.camunda.Starter" />


<!-- bind the process engine service as Spring Bean
<bean name="processEngineService" class="org.camunda.bpm.BpmPlatform" factory-method="getProcessEngineService" />
-->
<!-- bind the default process engine as Spring Bean
<bean name="processEngine" factory-bean="processEngineService" factory-method="getDefaultProcessEngine" />

<bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService"/>
<bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService"/>
<bean id="taskService" factory-bean="processEngine" factory-method="getTaskService"/>
<bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService"/>
<bean id="managementService" factory-bean="processEngine" factory-method="getManagementService"/>

-->
<!-- bootstrap the process application
<bean id="processApplication" class="org.camunda.bpm.engine.spring.application.SpringServletProcessApplication" />
<context:annotation-config />

<bean class="com.att.oce.bpm.camunda.Starter" />
<bean id="upgradeDfProcessService" class="com.att.oce.bpm.camunda.UpgradeDfProcessService" />
-->

</beans>

Reply all
Reply to author
Forward
0 new messages