

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 실행 콘텍스트
<a name="executioncontext"></a>

**Topics**
+ [결정 컨텍스트](#executioncontext.decision)
+ [활동 실행 컨텍스트](#activitycontext)

프레임워크에서는 워크플로 및 활동 구현에 주변 컨텍스트를 제공합니다. 이 컨텍스트는 처리 중인 작업에 고유한 것으로서, 사용자가 자신의 구현에 사용할 수 있는 약간의 유틸리티를 제공합니다. 컨텍스트 객체는 작업자가 새 작업을 처리할 때마다 생성됩니다.

## 결정 컨텍스트
<a name="executioncontext.decision"></a>

결정 작업이 실행될 때 프레임워크에서는 `DecisionContext` 클래스를 통해 워크플로 구현에 컨텍스트를 제공합니다. `DecisionContext`에서는 워크플로 실행의 실행 ID와 클록 및 타이머 기능과 같이 컨텍스트에 맞는 정보를 제공합니다.

### 워크플로 구현의 DecisionContext에 액세스
<a name="executioncontext.decision.access"></a>

`DecisionContextProviderImpl` 클래스를 사용하여 워크플로 구현의 `DecisionContext`에 액세스합니다. 또는 "테스트 가능성 및 종속성 주입" 단원에 나와 있는 것처럼 Spring을 사용하여 워크플로 구현의 필드 또는 속성에 컨텍스트를 주입할 수 있습니다.

```
DecisionContextProvider contextProvider
    = new DecisionContextProviderImpl();
DecisionContext context = contextProvider.getDecisionContext();
```

### 클록 및 타이머 생성
<a name="executioncontext.decision.timer"></a>

`DecisionContext`에는 타이머 및 클록 기능을 제공하는 `WorkflowClock` 유형의 속성이 포함되어 있습니다. 워크플로 로직은 결정적이어야 하므로 워크플로 구현에서 시스템 클럭을 직접 사용해서는 안 됩니다. `WorkflowClock`의 `currentTimeMills` 메서드에서는 처리 중인 결정의 시작 이벤트 시각을 반환합니다. 이를 통해 다시 재생 중에 동일한 시각을 가져올 수 있고, 따라서 워크플로 로직은 결정적인 것이 됩니다.

`WorkflowClock`에도 지정된 간격이 지나면 준비 상태가 되는 `Promise` 객체를 반환하는 `createTimer` 메서드가 있습니다. 이 값을 다른 비동기식 메서드에 파라미터로 사용하여 지정된 시간까지 실행을 연기할 수 있습니다. 이로써 비동기식 메서드 또는 활동을 나중에 실행하기 위해 효과적으로 예약할 수 있습니다.

다음 목록의 예시에서는 활동을 주기적으로 호출하는 방법을 보여줍니다.

```
@Workflow
@WorkflowRegistrationOptions(defaultExecutionStartToCloseTimeoutSeconds = 60,
               defaultTaskStartToCloseTimeoutSeconds = 10)
public interface PeriodicWorkflow {

    @Execute(version = "1.0")
    void periodicWorkflow();
}

@Activities(version = "1.0")
@ActivityRegistrationOptions(defaultTaskScheduleToStartTimeoutSeconds = 300,
                             defaultTaskStartToCloseTimeoutSeconds = 3600)
public interface PeriodicActivity {
    void activity1();
}

public class PeriodicWorkflowImpl implements PeriodicWorkflow {

    private DecisionContextProvider contextProvider
         = new DecisionContextProviderImpl();

    private WorkflowClock clock
         = contextProvider.getDecisionContext().getWorkflowClock();

    @Override
    public void periodicWorkflow() {
        callPeriodicActivity(0);
    }

    @Asynchronous
    private void callPeriodicActivity(int count,
                                      Promise<?>... waitFor) {
        if (count == 100) {
            return;
        }
        PeriodicActivityClient client = new PeriodicActivityClientImpl();
        // call activity
        Promise<Void> activityCompletion = client.activity1();

        Promise<Void> timer = clock.createTimer(3600);

        // Repeat the activity either after 1 hour or after previous activity run
        // if it takes longer than 1 hour
        callPeriodicActivity(count + 1, timer, activityCompletion);
    }
}


public class PeriodicActivityImpl implements PeriodicActivity
{
@Override
   public void activity1() {
      ...
      }
}
```

위 목록에서 `callPeriodicActivity` 비동기식 메서드는 `activity1`를 호출한 후 현재 `AsyncDecisionContext`를 사용하여 타이머를 생성합니다. 이 메서드는 반환된 `Promise`를 자신에 대한 재귀적 호출에 인수로 전달합니다. 이 재귀적 호출은 타이머가 소진될 때까지(이 예시에서는 1시간) 대기했다가 실행됩니다.

## 활동 실행 컨텍스트
<a name="activitycontext"></a>

`DecisionContext`에서 결정 작업이 처리 중일 때 컨텍스트 정보를 제공하는 것과 마찬가지로 `ActivityExecutionContext`에서는 활동 작업이 처리 중일 때 이와 유사한 컨텍스트 정보를 제공합니다. 이 컨텍스트는 `ActivityExecutionContextProviderImpl` 클래스를 통해 사용자의 활동 코드에 제공됩니다.

```
ActivityExecutionContextProvider provider
    = new ActivityExecutionContextProviderImpl();
ActivityExecutionContext aec = provider.getActivityExecutionContext();
```

`ActivityExecutionContext`를 사용하여 다음 작업을 수행할 수 있습니다.

### 장시간 실행 활동에 하트비트 사용
<a name="activitycontext.heartbeat"></a>

활동이 장시간 실행되는 경우 Amazon SWF에 진행 상황을 주기적으로 보고하여 작업이 여전히 진행 중임을 알려야 합니다. 그러한 하트비트가 없는 경우 작업 하트비트 제한 시간이 활동 유형 등록 시 또는 활동 예약 중에 설정되었다면 작업이 제한 시간을 초과할 수 있습니다. 하트비트를 전송하려면 `ActivityExecutionContext`의 `recordActivityHeartbeat` 메서드를 사용할 수 있습니다. 또한 하트비트에서는 지속적인 활동을 취소할 수 있는 메커니즘을 제공합니다. 추가 세부 정보 및 예시는 [오류 처리](errorhandling.md) 단원을 참조하십시오.

### 활동 작업에 관한 세부 정보 얻기
<a name="activitycontext.details"></a>

원하는 경우 실행기가 작업을 가져왔을 때 Amazon SWF에서 전달한 활동 작업에 관한 모든 세부 정보를 얻을 수 있습니다. 이 정보에는 작업, 작업 유형, 작업 토큰 등에 대한 입력에 관한 정보가 포함되어 있습니다. 예를 들어 사람의 작업에 의해 수동으로 완료되는 활동을 구현하려는 경우 `ActivityExecutionContext`를 사용하여 작업 토큰을 검색하고 이를 활동 작업을 완료하는 프로세스에 전달해야 합니다. 자세한 내용은 [활동을 수동으로 완료](activityimpl.md#activityimpl.complete) 단원을 참조하십시오.

### 실행기에서 사용 중인 Amazon SWF 클라이언트 객체 가져오기
<a name="activitycontext.client"></a>

실행기에서 사용 중인 Amazon SWF 클라이언트 객체는 `ActivityExecutionContext`의 `getService` 메서드를 직접적으로 호출하여 가져올 수 있습니다. 이 기능은 Amazon SWF 서비스를 직접 호출하려는 경우에 유용합니다.