Compatibilidda de Versiones
Activiti 7.6.0+ requiere JDK 11 o superior. La versión estable actual (7.6.1) depende de Spring Boot 2.7.5. Spring Boot 3.0.0+ necesita JDK 17 como mínimo. Configuración recomendada:
- Java 17
- Spring Boot 2.7.5
- Activiti 7.6.1
Configuración de Repositorio Maven
<repositories>
<repository>
<id>activiti-releases</id>
<url>https://artifacts.alfresco.com/nexus/content/repositories/activiti-releases</url>
</repository>
</repositories>
Gestión de Dependencias
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-dependencies</artifactId>
<version>7.6.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Ejemplo de POM Principal
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0">
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.5</version>
</parent>
<properties>
<java.version>17</java.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- Dependencias de Activiti y Dubbo -->
</dependencies>
</dependencyManagement>
<repositories>
<repository>
<id>activiti-releases</id>
<url>https://artifacts.alfresco.com/nexus/content/repositories/activiti-releases</url>
</repository>
</repositories>
</project>
Configuración de Aplicación
spring:
datasource:
url: jdbc:mysql://localhost:3306/workflow_db
username: admin
password: securepass
activiti:
database-schema-update: false
history-level: full
dubbo:
registry:
address: nacos://localhost:8848
Seguridad con Spring Security
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityChain(HttpSecurity http) throws Exception {
return http
.authorizeRequests(auth -> auth.anyRequest().authenticated())
.formLogin(Customizer.withDefaults())
.build();
}
@Bean
public UserDetailsService users() {
UserDetails user = User.builder()
.username("user1")
.password(passwordEncoder().encode("pass123"))
.roles("ACTIVITI_USER")
.build();
return new InMemoryUserDetailsManager(user);
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
Utilidad de Autenticación
@Component
public class AuthHelper {
@Autowired
private UserDetailsService userService;
public void authenticateUser(String username) {
UserDetails user = userService.loadUserByUsername(username);
SecurityContextHolder.getContext().setAuthentication(
new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities())
);
}
}
Operaciones con API de Activiti
@Service
public class FlowService {
@Autowired
private ProcessRuntime processEngine;
@Autowired
private AuthHelper authUtil;
public void startProcess(String processKey) {
authUtil.authenticateUser("admin");
processEngine.start(ProcessPayloadBuilder
.start()
.withProcessDefinitionKey(processKey)
.build()
);
}
public void completeTask(String taskId) {
authUtil.authenticateUser("user1");
taskRuntime.complete(TaskPayloadBuilder
.complete()
.withTaskId(taskId)
.build()
);
}
}
Manejadores de Eventos
@Configuration
public class EventConfig {
@Bean
public ProcessRuntimeEventListener<ProcessCompletedEvent> onProcessComplete() {
return event -> System.out.println("Proceso completado: " + event.getEntity().getId());
}
@Bean
public TaskRuntimeEventListener<TaskCompletedEvent> onTaskComplete() {
return event -> System.out.println("Tarea finalizada: " + event.getEntity().getName());
}
}