mingg IT

[BPMN] Camunda 분석 본문

기타

[BPMN] Camunda 분석

mingg123 2021. 8. 25. 12:07

https://docs.camunda.org/manual/latest/user-guide/process-engine/process-engine-bootstrapping/

BPMN을 효율적으로 그리기위해 나온 라이브러리이다. 

 

Process Engine 

1. 프로세스 엔진 부트스트랩

 

애플리케이션 관리 또는 공유 컨테이너 관리 프로세스 엔진을 사용하는지 여부에 따라 프로세스 엔진을 구성하고 생성하는 여러 옵션이 있음 

 

Application Managed Process Engine (애플리케이션 관리 프로세스 엔진)

애플리케이션의 일부로 프로세스 엔진을 관리한다.

1) Java API

2) XML

3) Via Spring 

 

Shared, Container Managered Process Engine (공유 컨테이너 관리 프로세스 엔진) 

선택한 컨테이너 (ex Tomcat, JBoss) 가 프로세스 엔진을 관리한다. 

 

ProcessEngineConfiguration Bean

카뮨다 엔진은 ProcessEngineConfiguration Bean을 사용하여 프로세스 엔진을 구성한다. 이러한 프로세스 엔진을 구성하는데 사용하는 여러 하위 클래스가 있다. 

  • org.camunda.bpm.engine.impl.cfg.StandaloneProcessEngineConfiguration
    프로세스 엔진은 독립 실행형 방식으로 사용됩니다. 엔진 자체가 트랜잭션을 처리합니다. 기본적으로 데이터베이스는 엔진이 부팅될 때만 검사됩니다(데이터베이스 스키마가 없거나 스키마 버전이 잘못된 경우 예외가 발생함).
  • org.camunda.bpm.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration
    이것은 단위 테스트를 위한 편의 클래스입니다. 엔진 자체가 트랜잭션을 처리합니다. 기본적으로 H2 인메모리 데이터베이스가 사용됩니다. 엔진이 부팅되고 종료될 때 데이터베이스가 생성되고 삭제됩니다. 이것을 사용하는 경우 추가 구성이 필요하지 않을 수 있습니다(예: 작업 실행기 또는 메일 기능을 사용하는 경우 제외).
  • org.camunda.bpm.engine.spring.SpringProcessEngineConfiguration
    Spring 환경에서 프로세스 엔진을 사용할 때 사용한다. 자세한 내용은 Spring 통합 섹션을 참조하세요.
  • org.camunda.bpm.engine.impl.cfg.JtaProcessEngineConfiguration
    엔진이 JTA 트랜잭션과 함께 독립 실행형 모드에서 실행될 때 사용됩니다.

2. Process Engine API (프로세스 엔진 API)

Services API

출처 https://docs.camunda.org/manual/latest/user-guide/process-engine/process-engine-api/

ProcessEngine 에서 워크플로우나 BPMN방법을 포함하는 서비스를 얻을 수 있다.

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

RepositoryService repositoryService = processEngine.getRepositoryService();
RuntimeService runtimeService = processEngine.getRuntimeService();
TaskService taskService = processEngine.getTaskService();
IdentityService identityService = processEngine.getIdentityService();
FormService formService = processEngine.getFormService();
HistoryService historyService = processEngine.getHistoryService();
ManagementService managementService = processEngine.getManagementService();
FilterService filterService = processEngine.getFilterService();
ExternalTaskService externalTaskService = processEngine.getExternalTaskService();
CaseService caseService = processEngine.getCaseService();
DecisionService decisionService = processEngine.getDecisionService();

ProcessEngines.getDefaultProcessEngine()처음 호출될 때 프로세스 엔진을 초기화하고 빌드한 다음 항상 동일한 프로세스 엔진을 반환한다. 

 

RepositoryService는 카뮨다 엔진을 작업할 때 필요한 첫 번째 서비스이다. 이는 배포 및 프로세스 정의를 관리하고 조작하는 작업을 제공한다. (여기서 말하는 배포는 엔진 내의 패키징 단위. 프로세스는 각 단계의 구조와 동작) 

패키징 단위를 배포한다는 것은 프로세스가 데이터베이스에 저장되기전에 검사 및 구문 분석되는 엔진에 업로드되는 것을 의미한다. 이 시점부터 프로세스를 시작할 수 있다. 

 

이러한 RepositoryService가 정적 정보(변경되지 않거나 최소한 많이 변경되지 않는 데이터)에 관한 것이라면 RunTimeService는 정 반대이다. 

 

RuntimeService 는 프로세스 정의의 새 프로세스 인스턴스 시작을 다룬다. (프로세스는 여러 단계의 구조와 동작을 정의한다)

프로세스 인스턴스는 이렇게 정의한 프로세스를 실행한다. 프로세스 변수를 검색하고 저장하는데 사용하는 서비스이다.

기본적으로 실행은 프로세스 인스턴스가 현재 있는 위치를 가리키는 포인터이다. 

마지막으로 RuntimeService는 프로세스 인스턴스가 외부 트리거를 기다리고 있고 프로세스를 계속해야 할 때마다 사용됩니다. 

프로세스 인스턴스는 다양한 대기 상태를 가질 수 있으며 이 서비스에는 외부 트리거가 수신되고 프로세스 인스턴스가 계속될 수 있음을 인스턴스에 '신호'하는 다양한 작업이 포함된다.

 

시스템의 실제 사용자가 수행해야 하는 작업은 프로세스 엔진의 핵심이다. 이겄은 TaskService에 그룹화 된다. 

TaskService는 시스템의 사용자가 수행하는 작업을 그룹화 해놓은 것 

예를 들자면

  • 사용자 또는 그룹에 할당된 작업 쿼리.
  • Creating new standalone tasks. These are tasks that are not related to a process instances.
  • Manipulating to which user a task is assigned or which users are in some way involved with the task.
  • Claiming and completing a task. Claiming means that someone decided to be the assignee for the task, meaning that this user will complete the task. Completing means ‘doing the work of the tasks’. Typically this is filling in a form of sorts.

IdentityService는 그룹 및 사용자의 관리(생성, 업데이트, 삭제, 쿼리 등)을 허용한다.

핵심 엔진은 실제로 런타임에 사용자를 검사하지 않는다.

예를 들어, 작업은 모든 사용자에게 할당될 수 있지만 엔진은 해당 사용자가 시스템에 알려져 있는지 확인하지 않는다.

엔진을 LDAP, Active Directory 등과 같은 서비스와 함께 사용할 수도 있기 때문임.

 

FormService는 필수는아니고 선택해서 사용할 수 있는 서비스이다. 

이 서비스는 시작 양식과 작업 양식의 개념을 소개합니다. 

시작 양식은 프로세스 인스턴스가 시작되기 전에 사용자에게 표시되는 양식이고 태스크 양식은 사용자가 태스크를 완료하려고 할 때 표시되는 양식이다. 

BPMN 2.0 프로세스 정의에서 이러한 양식을 정의할 수 있다.

이 서비스는 작업하기 쉬운 방법으로 이 데이터를 노출합니다. 그러나 다시, 양식이 프로세스 정의에 포함될 필요가 없기 때문에 선택 사항이다.

 

HistoryService는 엔진에 의해 수집된 모든 기록 데이터를 가지고 있다.

프로세스를 실행할 때 프로세스 인스턴스 시작 시간, 누가 어떤 작업을 수행했는지, 작업을 완료하는 데 걸린 시간, 각 프로세스 인스턴스에서 어떤 경로를 따랐는지 등과 같은 많은 데이터가 엔진에 의해 유지될 수 있다. 이 서비스는 주로 이 데이터에 액세스하기 위한 쿼리 기능을 제공한다.

 

ManagementService는 데이터베이스 테이블 및 테이블 메타데이터에 대한 정보를 검색할 수 있다. 

또한 작업에 대한 쿼리 기능 및 관리 작업을 볼 수 있다. 

작업은 타이머, 비동기식 연속, 지연된 일시 중단/활성화 등과 같은 다양한 작업을 위해 엔진에서 사용됩니다. 

(이 부분은 플로우 일시정지/재가동에 사용할 수 있겠다.)

 

FilterService는 필터를 생성하고 관리 할 수 있습니다. 

필터는 작업 쿼리와 같은 저장된 쿼리입니다. 예를 들어 필터는 Tasklist에서 사용자 작업을 필터링 하는데 사용한다.

 

ExternalTaskService는 외부 작업의 인스턴스에 대한 엑세스를 제공한다.

외부 작업은 프로세스 엔진과 독립적으로 외부에서 처리되는 작업 항목을 나타냅니다. (메일링 서비스나 이런걸 할 수 잇는 걸까?)

 

CaseService는 RuntimeService처럼하지만 경우 인스턴스입니다. 사례 정의의 새로운 사례 인스턴스를 시작하고 사례 실행의 수명 주기를 관리하는 것을 다룹니다. 서비스는 또한 케이스 인스턴스의 프로세스 변수를 검색하고 업데이트하는 데 사용됩니다.

 

DecisionService는 엔진에 배포 결정을 평가할 수 있다.

프로세스 정의와 비지니스 규칙 태스크 내에서 결정을 평가하는 대안이다. 

 

서비스 작업 및  엔진 API에 대한 부분은 해당 문서를 참고하면 된다. 

https://docs.camunda.org/javadoc/camunda-bpm-platform/7.16/org/camunda/bpm/package-summary.html

 

org.camunda.bpm (Camunda Platform Javadocs 7.16.0-SNAPSHOT)

The process application service provides access to all deployed process applications.

docs.camunda.org

 

Query API

엔진에서 쿼리를 이용하여 데이터를 처리하는 방법에는 여러가지가 있다.

  • Java 쿼리 API: 엔진 엔터티(예: ProcessInstances, Tasks 등)를 쿼리하는 Fluent Java API.
  • REST 쿼리 API: 엔진 엔터티(예: ProcessInstances, Tasks 등)를 쿼리하는 REST API.
  • 기본 쿼리: 쿼리 API에 필요한 가능성(예: OR 조건)이 부족한 경우 엔진 엔터티(예: ProcessInstances, Tasks 등)를 검색하기 위해 자체 SQL 쿼리를 제공합니다.
  • 사용자 정의 쿼리: 완전히 사용자 정의된 쿼리와 자체 MyBatis 매핑을 사용하여 자체 값 개체를 검색하거나 엔진을 도메인 데이터와 결합합니다.
  • SQL 쿼리: 보고와 같은 사용 사례에 데이터베이스 SQL 쿼리를 사용합니다.
List<Task> tasks = taskService.createTaskQuery()
  .taskAssignee("kermit")
  .processVariableValueEquals("orderId", "0815")
  .orderByDueDate().asc()
  .list();

이부분은 쿼리를 만들어서 전달해주기 때문에 사용하기 힘들듯

 

Paginated Queries 

List<Task> tasks = taskService.createTaskQuery()
  .taskAssignee("kermit")
  .processVariableValueEquals("orderId", "0815")
  .orderByDueDate().asc()
  .listPage(20, 50);

paginated를 사용하면 인덱스 뿐만 아니라 검색한 최대 결과를 구성할 수 있다.

processVariableValueEquals 는 orderId가 = 0815 인 듯하다.

 

REST Query API

https://docs.camunda.org/manual/latest/reference/rest/

 

REST API Reference | docs.camunda.org

We are looking for talented people. Check out our open positions.

docs.camunda.org

Native Queries

List<Task> tasks = taskService.createNativeTaskQuery()
  .sql("SELECT count(*) FROM " + managementService.getTableName(Task.class) + " T WHERE T.NAME_ = #{taskName}")
  .parameter("taskName", "aOpenTask")
  .list();

long count = taskService.createNativeTaskQuery()
  .sql("SELECT count(*) FROM " + managementService.getTableName(Task.class) + " T1, "
         + managementService.getTableName(VariableInstanceEntity.class) + " V1 WHERE V1.TASK_ID_ = T1.ID_")
  .count();

쿼리 API를 사용하여 표현할 수 없는 경우에 사용한다. 테이블 이름은 데이터베이스에서 실행되므로 그대로 사용해야한다. 

 

Custom Queries

성능상의 이유로 DTO에서 쿼리를 만들어 사용하는것이 좋을 경우도 있다. 

https://camunda.com/blog/2017/12/custom-queries/

 

Custom Queries - Camunda

Why Custom Queries? The process engine offers a pretty straightforward and easy to use Java Query API. If you want to build a task list you just write something like this: @Inject private TaskService taskService; public List getAllTasks() { return ta

camunda.com

SQL Queries

 


3. Process Engine Concepts

Process Definitions

카뮨다는 BPMN2.0기준으로 모델링 프로세스를 정의한다.

https://camunda.com/bpmn/

 

BPMN 2.0 Tutorial - Get started with Process Modeling using BPMN - Camunda

Review real-world examples and learn how to use BPMN 2.0 diagrams to model processes and improve business - IT alignment.

camunda.com

Query for Process Definitions

List<ProcessDefinition> processDefinitions = repositoryService.createProcessDefinitionQuery()
    .processDefinitionKey("invoice")
    .orderByProcessDefinitionVersion()
    .asc()
    .list();

Java API를 사용하여 쿼리를 만들었고 RepositoryService에서 createProcessDefinitionQuery의 예시이다.

위의 쿼리는 invoice 별로 정렬된 키에 대해 배포된 프로세스 정의를 반환한다.

 

Keys and Versions

위에서 사용한 invoice는 프로세스의 식별자이다. API전체에서 사용되며 프로세스 인스턴스를 시작하는데 사용된다. 

동일한 키를 사용하여 여러 프로세스를 배포하는 경우에는 프로세스 엔진에서 동일한 프로세스 정의의 개별 버전으로 처리한다.

 

Suspend Process Definitions

프로세스 정의를 일시 중단하면 일시적으로 비활성화 된다. 일시 중단 동안에는 인스턴스화 할 수 없다. 

RuntimeService 자바 API를 사용하여 프로세스 정의를 일시중단 할 수 있다. 또한 일시중단상태에서 활성화도 가능하다. 

(이거 나중에 플로우 일시정지에서 사용할 수 있을듯)

 

Process Instance

프로세스 인스턴스란 프로세스 정의를 개별로 실행하는 것이다. 

프로세스 엔진은 이 프로세스 인스턴스를 만들고 상태를 관리하는 역할을 한다.

예를들어 사용자의 작업을 시작하는 경우 프로세스 엔진은 사용자 작업이 완료될 때 까지 프로세스 인스턴스의 상태를 가지고 있고, DB내부에 저장되도록 한다. 

ProcessInstance instance = runtimeService.startProcessInstanceByKey("invoice");

프로세스 인스턴스는 RunTimeService의 메소드를 사용한다. 

Map<String, Object> variables = new HashMap<String,Object>();
variables.put("creditor", "Nice Pizza Inc.");
ProcessInstance instance = runtimeService.startProcessInstanceByKey("invoice", variables);

map에 정보를 담아서 runtimeService의 startProcessInstanceByKey로 넘겨준다. 

프로세스 변수는 프로세스 인서튼서의 모든 task에서 사용할 수 있으며 프로세스 인스턴스가 대기 상태로 도달하는 경우 데이터베이스에 자동으로 유지된다. 

(내가 사용하는 부분)

 

Start Process Instances via tasklist

작업목록을 통해  프로세스 인스턴스를 시작할 수 있다.

taskList를 사용하여 프로세스 인스턴스 starttableInTasklist를 시작하는 경우 사용자가 시작할 때 볼 수 있는 프로세스를 지정하는 옵션이 있다. 

<process id="subProcess"
         name="Process called from Super Process"
         isExecutable="true"
         camunda:isStartableInTasklist="false">
...
</process>

 

Start a Process Instance at Any Set of Activities

RuntimeService의 메소드 createProcessInstanceByKey 나 createProcessInstanceById를 사용하여 프로세스 인스턴스를 시작한다. 

ProcessInstance instance = runtimeService.createProcessInstanceByKey("invoice")
  .startBeforeActivity("SendInvoiceReceiptTask")
  .setVariable("creditor", "Nice Pizza Inc.")
  .startBeforeActivity("DeliverPizzaSubProcess")
  .setVariableLocal("destination", "12 High Street")
  .execute();

 

Variables in Return

ProcessInstanceWithVariables instance = runtimeService.createProcessInstanceByKey("invoice")
  .startBeforeActivity("SendInvoiceReceiptTask")
  .setVariable("creditor", "Nice Pizza Inc.")
  .startBeforeActivity("DeliverPizzaSubProcess")
  .setVariableLocal("destination", "12 High Street")
  .executeWithVariablesInReturn();

executeWithVariablesInReturn를 사용하면 프로세스 인스턴스의 정보와 최신 변수를 알 수 있다.

 

Query for Process Instances

프로세스 인스턴스에 대한 쿼리

runtimeService.createProcessInstanceQuery()
    .processDefinitionKey("invoice")
    .variableValueEquals("creditor", "Nice Pizza Inc.")
    .list();

createProcessInstanceQuery를 사용하여 현재 실행중인 모든 프로세스에 인스턴스쿼리를 만들 수 있다. 

REST API를 사용할 수 도 있다.https://docs.camunda.org/manual/latest/reference/rest/process-instance/get-query/

 

Get Instances | docs.camunda.org

Queries for process instances that fulfill given parameters. Parameters may be static as well as dynamic runtime properties of process instances. The size of the result set can be retrieved by using the Get Instance Count method. Method GET /process-instan

docs.camunda.org

Interact With a Process Instance

특정 프로세스 인스턴스(또는 프로세스 인스턴스 목록)에 대한 쿼리를 수행한 후에는 해당 인스턴스와 상호 작용할 수 있다.

 

Suspend Process Instance

프로세스 인스턴스를 일시 중단할 수 있다. 

예를 들어, 프로세스 변수가 원하지 않는 상태에 있는 경우 인스턴스를 일시 중단하고 변수를 안전하게 변경할  있다.

또한 프로세스 인스턴스를 일시 중단하면 해당 인스턴스에 속한 모든 작업이 일시 중단됩니다. 

따라서 작업의 수명 주기 에 영향을 미치는 작업 (즉, 사용자 할당, 작업 위임, 작업 완료 등) 을 더 이상 호출할 수 없다 . 

그러나 변수 설정 또는 주석 추가와 같이 수명 주기에 영향을 주지 않는 모든 작업은 계속 허용됩니다.

RuntimeService. suspendProcessInstanceById(...)메소드를 사용하여 프로세스 인스턴스를 일시 중단할 수 있다 . 

지정된 프로세스 정의의 모든 프로세스 인스턴스를 일시 중단하려면 RepositoryService.suspendProcessDefinitionById(...)를 사용하고 suspendProcessInstances옵션을 지정할 수 있다.

 

Executions

프로세스 인스턴스에 여러 경로가 포함된 경우 프로세스 인스턴스 내에서 현재 활성 경로를 구별할 수 있어야 한다. 

내부족으로 프로세스 엔진은 프로세스 인스턴스 내에서 동시 실행 경로에 대해 하나씩 두개의 동시 실행을 생성한다. 

프로세스 인스턴스 자체가 실행이며. 실행은 변수 범위, 즉 동적 데이터가 연결된다.

 

Query for Executions

runtimeService.createExecutionQuery()
    .processInstanceId(someId)
    .list();

RuntimeService.createExecutionQuery를 사용하여 쿼리를 실행할 수 있다.

위의 쿼리는 프로세스 인스턴스에 대한 모든 실행을 반환한다.

 

Activity Instances

Executions 과 유사하지만 다르다. Executions은 프로세스를 통해 이동 하는 토큰 으로 상상할 수 있지만 

Activity Instances는 활동(작업, 하위 프로세스 등)의 개별 인스턴스를 나타냅니다. 

따라서 활동 인스턴스의 개념은 상태 지향적 입니다.

 

Retrieve an Activity Instance

ActivityInstance rootActivityInstance = runtimeService.getActivityInstance(processInstance.getProcessInstanceId());

현재 Activity Instance는 프로세스 인스턴스에 대해서만 검색할 수 있습니다.

 

Identity & Uniqueness

Activity Instance는 고유한 ID가 할당됩니다. ID는 영구적입니다. 

 

Relation to Executions Activity Instance

일반적으로 Executions와 ActivityInstances 사이에는 n-1 관계가 있다.

즉, 주어진 시점에 활동 인스턴스가 여러 실행에 연결될 수 있다. 

또한 주어진 Activity Instance를 시작한 동일한 Executions이 종료된다는 보장도 없습니다. 

프로세스 엔진은 실행이 재정렬되고 정리될 수 있는 실행 트리 압축과 관련하여 여러 내부 최적화를 수행합니다. 

이것은 주어진 Executions이 Activity Instance를 시작하지만 다른 실행이 그것을 종료하는 상황으로 이어질 수 있습니다. 

또 다른 특별한 경우는 프로세스 인스턴스입니다.

 

Jobs and Job Definitions

Camunda 프로세스 엔진에는 Job Executor 라는 구성 요소가 포함되어 있다. 

Job Executor는 비동기식 백그라운드 작업을 수행하는 스케줄링 구성요소 이다. 

예를들어 타이머 이벤트 같은 경우 프로세스 엔진은 타이머 이벤트에 도달할 때마다 실행을 중지하고 현재 상태를 데이터베이스에 유지하며 나중에 실행을 재개하기 위해 작업을 생성 한다. 

작업에는 BPMN XML에 제공된 타이머 표현식을 사용하여 계산되는 기한이 있다.

프로세스가 배포되면 프로세스 엔진은 런타임에 작업을 생성할 프로세스의 각 활동에 대한 작업 정의를 생성 한다. 

이를 통해 프로세스의 타이머 및 비동기 연속에 대한 정보를 쿼리할 수 있다.

 

Query for jobs

managementService.createJobQuery()
  .duedateHigherThan(someDate)
  .list()

managementService를 이용하여 특정 날짜 이후에 마감되는 모든 작업을 선택할 수 있다.

 

 

Query for Job Definitions

managementService.createJobDefinitionQuery()
  .processDefinitionKey("orderProcess")
  .list()

특정 프로세스 정의에서 모든 작업을 선택한다.

 

 

Suspend and Activate Job Execution

작업 일시 정지는 작업이 실행되지 않도록 합니다. 이를 여러 수준에서 제어할 수 있습니다.

  • Job Instance Level: 개별 작업은 managementService.suspendJob(...)API를 통해 직접 또는 프로세스 인스턴스 또는 작업 정의를 일시 중단할 때 전이적 으로 일시 중단될 수 있습니다 .
  • Job Definition Level: 특정 타이머 또는 활동의 모든 인스턴스가 일시 정지 할 수 있다. 

Job Definition 에 의한 작업 일시 중지를 사용하면 특정 타이머 또는 비동기 연속의 모든 인스턴스를 일시 중지할 수 있다. 

직관적으로 이것은 모든 프로세스 인스턴스가 이 활동에 도달할 때까지 진행되고 활동이 일시 중단된 이후 계속되지 않는 방식으로 프로세스의 특정 활동을 일시 중단할 수 있다.

List<JobDefinition> jobDefinitions = managementService.createJobDefinitionQuery()
        .processDefinitionKey("orderProcess")
        .activityIdIn("processPayment")
        .list();

for (JobDefinition jobDefinition : jobDefinitions) {
  managementService.suspendJobDefinitionById(jobDefinition.getId(), true);
}

orderProcess라는 서비스 작업이 포함된 key 로 배포된 프로세스가 있다고 가정한다. 이 프로세스의 id는 processPayment. 이다.

suspendJobDefinitionById를 이용하여 processPayment서비스가 실행 되지 않는다. 


4. Process Variables

variables 를 사용하여 런타임 상태 똑은 데이터를 추가할 수 있다. 

엔티티의 상태를 변경하는 다양한 API 메서드를 사용하면 연결된 변수를 업데이트 할 수 있다. 

이름은 프로세스 구성에서 식별에 사용된다. 

 

Variable Scopes and Variable Visibility

 

변수를 가질 수 있는 모든 엔티티를 변수 범위라고 한다. 

 

해당 프로세스의 런타임 구조이다.

각각 태스크를 생성한 두 개의 자식 실행이 있는 프로세스 인스턴스가 있다. 

이 5가지 항목은 모두 가변 범위이며 화살표는 부모-자식 관계를 표시한다.

부모-> 자식은 가능하지만 자식-> 부모는 할 수 없다.

이 경우 Task 1 에서 작업 할 때 worker  customer 에 액세스할 수 있습니다. 

범위 구조로 인해 worker 변수를 두 번 정의할 수 있으므로 Task 1  Task 2 와 다른 worker 변수에 액세스 할 수 있습니다 . 

그러나 둘 다 변수 customer  공유하므로 해당 변수가 작업 중 하나에 의해 업데이트되면 이 변경 사항이 다른 작업에도 표시됩니다.

두 작업은 각각 두 개의 변수에 액세스할 수 있지만 이들 중 어느 것도 로컬 변수가 아닙니다. 

세 가지 executions 모두에는 각각 하나의 지역 변수가 있습니다.

이제 Task 1 에서 지역 변수 customer  설정했다고 가정해 보겠습니다 .

customer  worker라는 두 변수  Task 1 에서 계속 액세스할 수 있지만 Execution 1  고객 변수 는 숨겨져 있으므로 액세스 가능한 customer 변수는 Task 1 의 로컬 변수입니다 .

 

일반적으로 변수는 다음과 같은 경우에 액세스할 수 있습니다.

  • 프로세스 인스턴스화
  • 메시지 전달
  • 완료 또는 해결과 같은 작업 수명 주기 전환
  • 외부에서 변수 설정/가져오기
  • Delegate 에서 변수 설정/가져오기
  • 프로세스 모델의 표현식
  • 프로세스 모델의 스크립트
  • (과거) 변수 쿼리

Set and Retrieve Variables - Overview

변수를 설정하고 검색하기 위해 프로세스 엔진은 Java 객체에서 변수를 설정하고 동일한 형식으로 검색할 수 있는 Java API를 제공합니다. 내부적으로 엔진은 데이터베이스에 변수를 유지하므로 직렬화를 적용합니다. 대부분의 응용 프로그램에서 이것은 걱정할 필요가 없는 세부 사항입니다. 그러나 때로는 사용자 정의 Java 클래스로 작업할 때 변수의 직렬화된 값이 중요합니다. 많은 프로세스 애플리케이션을 관리하는 모니터링 애플리케이션의 경우를 상상해 보십시오. 해당 응용 프로그램의 클래스에서 분리되므로 Java 표현의 사용자 정의 변수에 액세스할 수 없습니다. 이러한 경우 프로세스 엔진은 직렬화된 값을 검색하고 조작하는 방법을 제공합니다. 이것은 두 개의 API로 요약됩니다.

  • Java Object Value API : 변수는 Java 객체로 표현됩니다. 이러한 개체는 값으로 직접 설정하고 동일한 형식으로 검색할 수 있습니다. 이것은 보다 간단한 API이며 프로세스 애플리케이션의 일부로 코드를 구현할 때 권장되는 방법입니다.
  • 형식화된 값 API : 변수 값은 변수 를 설정하고 검색하는 데 사용되는 소위 형식화 된 값으로 래핑됩니다 . 유형이 지정된 값은 엔진이 변수를 직렬화한 방식 및 유형에 따라 직렬화된 변수 표현과 같은 메타데이터에 대한 액세스를 제공합니다. 메타데이터에는 변수가 일시적인지 여부에 대한 정보도 포함됩니다.

Setting variables to specific scope

Suspported Variable Values

Object Value Serialization

Java Object API

Typed Value API

JSON and XML Values

Transient variables

 

 

 

 

 

 

 

 

 

Comments