

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

# 활동 구현
<a name="activityimpl"></a>

활동은 `@Activities` 인터페이스의 구현을 제공함으로써 구현됩니다. AWS Flow Framework for Java는 작업자에 구성된 활동 구현 인스턴스를 사용하여 런타임에 활동 작업을 처리합니다. 작업자는 적절한 유형의 활동 구현을 자동으로 검색합니다.

사용자는 속성 및 필드를 사용하여 데이터베이스 연결과 같은 활동 인스턴스로 리소스를 전달할 수 있습니다. 활동 구현 객체는 여러 스레드에서 액세스할 수 있으므로 공유 리소스는 스레드에 안전해야 합니다.

활동 구현에서는 `Promise<>` 유형의 파라미터를 받아들이거나 이 유형의 객체를 반환하지 않는다는 점에 유의하십시오. 이는 활동의 구현이 간접적으로 호출된 방식(동기식 또는 비동기식)에 의존해서는 안 되기 때문입니다.

앞서 설명한 활동 인터페이스는 다음과 같이 구현될 수 있습니다.

```
public class MyActivitiesImpl implements MyActivities {

   @Override
   @ManualActivityCompletion
   public int activity1(){
      //implementation
   }

   @Override
   public void activity2(int foo){
     //implementation
   }
}
```

스레드 로컬 컨텍스트는 사용 중인 작업 객체, 데이터 변환기 객체 등을 가져오는 데 사용할 수 있는 활동 구현에 대해 사용할 수 있습니다. 현재 컨텍스트는 `ActivityExecutionContextProvider.getActivityExecutionContext()`를 통해 액세스할 수 있습니다. 자세한 내용은 AWS SDK for Java 및 섹션을 참조`ActivityExecutionContext`하세요[실행 콘텍스트](executioncontext.md).

## 활동을 수동으로 완료
<a name="activityimpl.complete"></a>

위 예시의 `@ManualActivityCompletion` 주석은 선택 사항입니다. 이 주석은 활동을 구현하는 메서드에서만 허용되며 활동 메서드에서 결과가 반환될 때 활동이 자동으로 완료되지 않도록 구성하는 데 사용됩니다. 이는 활동을 비동기적으로 완료하려는 경우(예: 사람의 작업이 완료된 후 수동으로 완료하려는 경우)에 유용할 수 있습니다.

활동 메서드에서 결과를 반환하면 프레임워크에서는 기본적으로 완료된 활동을 고려합니다. 이는 활동 작업자가 활동 작업 완료를 Amazon SWF에 보고하고 결과를 제공함을 뜻합니다(있는 경우). 그러나 활동 메서드에서 결과가 반환될 때 활동 작업이 완료됨으로 표시되는 것을 사용자가 원하지 않는 사용 사례가 있습니다. 이 기능은 인간 작업을 모델링할 때 특히 유용합니다. 예를 들어 활동 메서드에서는 활동 작업이 완료되기 전에 일부 작업을 완료해야 하는 사람에게 이메일을 전송할 수 있습니다. 이러한 경우 사용자는 활동 메서드에 `@ManualActivityCompletion` 주석을 붙여 활동 작업자에게 활동을 자동으로 완료해서는 안 된다고 알릴 수 있습니다. 활동을 수동으로 완료하기 위해 프레임워크에서 제공하는 `ManualActivityCompletionClient`를 사용하거나 Amazon SWF SDK에서 제공하는 Amazon SWF Java 클라이언트에 있는 `RespondActivityTaskCompleted` 메서드를 사용할 수 있습니다. 자세한 내용은 AWS SDK for Java 설명서를 참조하세요.

활동 작업을 완료하려면 작업 토큰을 제공해야 합니다. 작업 토큰은 Amazon SWF에서 작업을 고유하게 식별하는 데 사용됩니다. 활동 구현의 `ActivityExecutionContext`에서 이 토큰에 액세스할 수 있습니다. 이 토큰을 작업을 완료할 책임이 있는 당사자에게 전달해야 합니다. 이 토큰은 `ActivityExecutionContextProvider.getActivityExecutionContext().getTaskToken()`을 호출하여 `ActivityExecutionContext`에서 가져올 수 있습니다.

다음과 같이 Hello World 예시의 `getName` 활동을 구현하여 누군가에게 인사말 메시지를 제공하도록 요청하는 이메일을 보낼 수 있습니다.

```
@ManualActivityCompletion
@Override
public String getName() throws InterruptedException {
    ActivityExecutionContext executionContext
         = contextProvider.getActivityExecutionContext();
    String taskToken = executionContext.getTaskToken();
    sendEmail("abc@xyz.com",
         "Please provide a name for the greeting message and close task with token: " + taskToken);
    return "This will not be returned to the caller";
}
```

다음 코드 조각은 인사말을 제공하고 `ManualActivityCompletionClient`를 사용하여 작업을 종료하는 데 사용할 수 있습니다. 또는 다음과 같이 작업을 실패 처리할 수도 있습니다.

```
public class CompleteActivityTask {

    public void completeGetNameActivity(String taskToken) {

        AmazonSimpleWorkflow swfClient
           = new AmazonSimpleWorkflowClient(...); // use AWS access keys
        ManualActivityCompletionClientFactory manualCompletionClientFactory
           = new ManualActivityCompletionClientFactoryImpl(swfClient);
        ManualActivityCompletionClient manualCompletionClient
           = manualCompletionClientFactory.getClient(taskToken);
        String result = "Hello World!";
        manualCompletionClient.complete(result);
    }

    public void failGetNameActivity(String taskToken, Throwable failure) {
        AmazonSimpleWorkflow swfClient
           = new AmazonSimpleWorkflowClient(...); // use AWS access keys
        ManualActivityCompletionClientFactory manualCompletionClientFactory
           = new ManualActivityCompletionClientFactoryImpl(swfClient);
        ManualActivityCompletionClient manualCompletionClient
           = manualCompletionClientFactory.getClient(taskToken);
        manualCompletionClient.fail(failure);
    }
}
```