Activiti Spring Configuration
1. Activiti Configuration using XML
1.1 Activiti Configuration XML Test
2. Activiti Configuration using Annotations
2.1 Activiti Configuration Annotation Test
1. Activiti Configuration using XML
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
<property name="driverClass" value="org.h2.Driver" />
<property name="url" value="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000" />
<property name="username" value="sa" />
<property name="password" value="" />
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
<property name="databaseType" value="h2" />
<property name="dataSource" ref="dataSource" />
<property name="transactionManager" ref="transactionManager" />
<property name="databaseSchemaUpdate" value="true" />
<property name="deploymentResources"
value="classpath*:diagrams/underwriting_queue.bpmn" />
<property name="history" value="audit" />
<property name="jobExecutorActivate" value="false" />
</bean>
<bean id="processEngine" class="org.activiti.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" />
</beans>
1.1 Activiti Configuration XML Test
package com.nuke.activiti.spring;
import static org.junit.Assert.assertEquals;
import java.util.HashMap;
import java.util.Map;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.nuke.activiti.common.AbstractTest;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring-test-application-context.xml")
public class SpringTest extends AbstractTest {
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@Test
public void simpleProcessTest() {
Map<String, Object> variableMap = new HashMap<String, Object>();
variableMap.put("LoanId", 123456789);
runtimeService.startProcessInstanceByKey("underwritingQueue", variableMap);
Task task = taskService.createTaskQuery().singleResult();
assertEquals("Unassigned Loan", task.getName());
taskService.complete(task.getId());
assertEquals(1, runtimeService.createProcessInstanceQuery().count());
}
}
2. Activiti Configuration using Annotations
package com.nuke.config;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.impl.HistoryServiceImpl;
import org.activiti.engine.impl.ManagementServiceImpl;
import org.activiti.engine.impl.RepositoryServiceImpl;
import org.activiti.engine.impl.RuntimeServiceImpl;
import org.activiti.engine.impl.TaskServiceImpl;
import org.activiti.engine.impl.history.HistoryLevel;
import org.activiti.engine.impl.interceptor.SessionFactory;
import org.activiti.spring.SpringProcessEngineConfiguration;
import org.activiti.spring.annotations.AbstractActivitiConfigurer;
import org.activiti.spring.annotations.EnableActiviti;
import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import com.nuke.ldap.LDAPConnectionParams;
import com.nuke.ldap.LDAPGroupManagerFactory;
import com.nuke.ldap.LDAPUserManagerFactory;
@Configuration
@EnableActiviti
@EnableTransactionManagement(proxyTargetClass = true)
//@PropertySource("file:conf/lc-merged.properties")
public class ActivitConfiguration {
@Bean
public DataSource inMemoryDataSource() {
BasicDataSource basicDataSource = new BasicDataSource();
basicDataSource.setUsername("sa");
basicDataSource.setUrl("jdbc:h2:mem:activiti");
basicDataSource.setDefaultAutoCommit(false);
basicDataSource.setDriverClassName(org.h2.Driver.class.getName());
basicDataSource.setPassword("");
return basicDataSource;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(DataSource inMemoryDataSource) {
LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
localContainerEntityManagerFactoryBean.setDataSource(inMemoryDataSource);
localContainerEntityManagerFactoryBean.setPackagesToScan(new String[]{"com.nuke.model"});
localContainerEntityManagerFactoryBean.setPersistenceUnitName("nuke");
HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
jpaVendorAdapter.setGenerateDdl(false);
jpaVendorAdapter.setShowSql(false);
jpaVendorAdapter.setDatabasePlatform("org.hibernate.dialect.H2Dialect");
localContainerEntityManagerFactoryBean.setJpaVendorAdapter(jpaVendorAdapter);
return localContainerEntityManagerFactoryBean;
}
@Bean
public PlatformTransactionManager jpaTransactionManager(EntityManagerFactory entityManagerFactoryBean) {
return new JpaTransactionManager(entityManagerFactoryBean);
}
@Value("${LC_NUKE_LDAP_URL:localhost}")
private String ldapServer;
@Value("${LC_NUKE_LDAP_PORT}")
private String ldapPort;
@Value("${LC_NUKE_LDAP_USERNAME:uid=admin,ou=system}")
private String ldapUser;
@Value("${LC_NUKE_LDAP_PASSWORD:secret}")
private String ldapPassword;
@Bean
public LDAPConnectionParams ldapConnection(){
LDAPConnectionParams ldapConnection = new LDAPConnectionParams();
ldapConnection.setLdapServer(ldapServer);
ldapConnection.setLdapPort(10389);
ldapConnection.setLdapUser(ldapUser);
ldapConnection.setLdapPassword(ldapPassword);
return ldapConnection;
}
@Value("${LC_NUKE_MAIL_HOST}")
private String mailHost;
@Value("${LC_NUKE_MAIL_USERNAME}")
private String mailUsername;
@Value("${LC_NUKE_MAIL_PASSWORD}")
private String mailServerPassword;
@Bean
public AbstractActivitiConfigurer abstractActivitiConfigurer(final EntityManagerFactory entityManagerFactoryBean, final PlatformTransactionManager jpaTransactionManager) {
return new AbstractActivitiConfigurer() {
@Override
public void postProcessSpringProcessEngineConfiguration(SpringProcessEngineConfiguration engine) {
engine.setDatabaseType("h2");
engine.setDataSource(inMemoryDataSource());
engine.setTransactionManager(jpaTransactionManager);
engine.setJpaEntityManagerFactory(entityManagerFactoryBean);
engine.setJpaHandleTransaction(true);
engine.setJobExecutorActivate(true);
engine.setJpaCloseEntityManager(false);
engine.setMailServerDefaultFrom("nucleus@lc.com");
engine.setMailServerHost(mailHost);
engine.setMailServerPort(587);
engine.setMailServerUsername(mailUsername);
engine.setMailServerPassword(mailServerPassword);
engine.setMailServerUseSSL(true);
engine.setMailServerUseTLS(true);
engine.setRepositoryService(repositoryService());
engine.setTaskService(taskService());
engine.setManagementService(managementService());
engine.setRuntimeService(runtimeService());
engine.setHistoryService(historyService());
engine.setHistoryLevel(HistoryLevel.AUDIT);
Resource[] processResources = new Resource[1] ;
Resource underwritingQueueProcess = new ClassPathResource("diagrams/underwriting_queue.bpmn");
processResources[0]=underwritingQueueProcess;
engine.setDeploymentResources(processResources);
List<SessionFactory> customSessionFactories = new ArrayList<SessionFactory>();
customSessionFactories.add(new LDAPGroupManagerFactory(ldapConnection()));
customSessionFactories.add(new LDAPUserManagerFactory(ldapConnection()));
engine.setCustomSessionFactories(customSessionFactories);
engine.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
}
};
}
@Bean
public RepositoryServiceImpl repositoryService(){
RepositoryServiceImpl repositoryService = new RepositoryServiceImpl();
return repositoryService;
}
@Bean
public TaskServiceImpl taskService(){
TaskServiceImpl taskService = new TaskServiceImpl();
return taskService;
}
@Bean
public ManagementServiceImpl managementService(){
ManagementServiceImpl managementService = new ManagementServiceImpl();
return managementService;
}
@Bean
public RuntimeServiceImpl runtimeService(){
RuntimeServiceImpl runtimeService = new RuntimeServiceImpl();
return runtimeService;
}
@Bean
public HistoryServiceImpl historyService(){
HistoryServiceImpl historyService = new HistoryServiceImpl();
return historyService;
}
}
2.1 Activiti Configuration Annotation Test
package com.nuke.activiti.spring;
import static org.junit.Assert.assertEquals;
import java.util.HashMap;
import java.util.Map;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.nuke.config.ActivitConfiguration;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=ActivitConfiguration.class)
public class SpringWithAnnotations {
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@Test
public void simpleProcessTest() {
Map<String, Object> variableMap = new HashMap<String, Object>();
variableMap.put("LoanId", 123456789);
runtimeService.startProcessInstanceByKey("underwritingQueue", variableMap);
Task task = taskService.createTaskQuery().singleResult();
assertEquals("Unassigned Loan", task.getName());
taskService.complete(task.getId());
assertEquals(1, runtimeService.createProcessInstanceQuery().count());
}
}
I liked the post, but it seems that Activiti dropped support for annotation based config in 5.16.4. I was looking around for how to implement a Spring java config approach to creating Activiti beans and landed here. It’s a shame that there isn’t more documentation on the Activiti-Spring maven artifact and the intended use of the API.
see post: http://forums.activiti.org/content/enableactiviti-5164