Activiti7을 활용한 첫 번째 워크플로우 구축

1. 의존성 추가

Activiti7 통합을 위한 Spring Boot Starter 의존성 설정:

<dependency>
    <groupId>org.activiti</groupId>
    <artifactId>activiti-spring-boot-starter</artifactId>
    <version>7.1.0.M4</version>
</dependency>
<dependency>
    <groupId>org.activiti.dependencies</groupId>
    <artifactId>activiti-dependencies</artifactId>
    <version>7.1.0.M4</version>
    <type>pom</type>
</dependency>

2. 핵심 컴포넌트

  • Task: 작업 실행 단위
  • HistoricTaskInstance: 완료/삭제된 과거 작업 기록
  • Deployment: 프로세스 배포 관리
  • ProcessDefinition: 프로세스 정의 정보
  • ProcessInstance: 실행 중인 프로세스 인스턴스

3. 프로세스 배포(Deployment)

BPMN 파일을 Activiti 엔진에 등록하는 과정:

@PostMapping("/deploy/string")
public ResponseDTO deployByString(@RequestParam("bpmnContent") String bpmnContent) {
    Deployment deployment = repositoryService.createDeployment()
        .addString("workflow.bpmn", bpmnContent)
        .name("배포예제")
        .deploy();
    return new ResponseDTO("SUCCESS", deployment.getId());
}

지원 배포 방식:

  • BPMN 파일 직접 배포
  • ZIP 압축 파일 배포
  • 문자열 기반 배포
@Test
public void deployZip() {
    InputStream zipStream = getClass().getResourceAsStream("/bpmn/workflows.zip");
    repositoryService.createDeployment()
        .addZipInputStream(new ZipInputStream(zipStream))
        .deploy();
}

4. 프로세스 정의(ProcessDefinition)

배포된 워크플로우의 메타정보 관리:

@GetMapping("/definitions")
public List<ProcessDefinition> getProcessDefinitions() {
    return repositoryService.createProcessDefinitionQuery()
        .orderByProcessDefinitionVersion().desc()
        .list();
}

5. 프로세스 인스턴스(ProcessInstance)

실행 중인 워크플로우 인스턴스 관리:

@PostMapping("/start/{processKey}")
public String startProcess(@PathVariable String processKey) {
    ProcessInstance instance = runtimeService
        .startProcessInstanceByKey(processKey);
    return instance.getId();
}

인스턴스 상태 제어:

// 인스턴스 일시 정지
runtimeService.suspendProcessInstanceById(instanceId);

// 인스턴스 재개
runtimeService.activateProcessInstanceById(instanceId);

// 인스턴스 삭제
runtimeService.deleteProcessInstance(instanceId, "삭제사유");

6. 작업(Task) 관리

사용자 할당 작업 처리:

@GetMapping("/tasks")
public List<Task> getUserTasks(@RequestParam String assignee) {
    return taskService.createTaskQuery()
        .taskAssignee(assignee)
        .list();
}

@PostMapping("/complete/{taskId}")
public void completeTask(@PathVariable String taskId) {
    taskService.complete(taskId);
}

7. 비용 청구 워크플로우 구현

BPMN 설계 예시:

<process id="expenseProcess">
    <startEvent id="start"/>
    <userTask id="submitExpense" name="비용제출" assignee="제출자"/>
    <userTask id="approveExpense" name="승인처리" assignee="승인자"/>
    <endEvent id="end"/>
</process>

프로세스 실행 흐름:

// 배포
Deployment deployment = repositoryService.createDeployment()
    .addClasspathResource("expense.bpmn")
    .deploy();

// 인스턴스 시작
ProcessInstance instance = runtimeService
    .startProcessInstanceByKey("expenseProcess");

// 작업 조회
Task task = taskService.createTaskQuery()
    .processInstanceId(instance.getId())
    .singleResult();

태그: Activiti7 워크플로우 BPMN Spring Boot java

7월 5일 17:54에 게시됨