Integración de Activiti 7 con Spring Boot

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());
  }
}

Etiquetas: Activiti7 SpringBoot Java17 workflow BPMN

Publicado el 7-23 08:37