활동 구현 - AWS Flow Framework Java용

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

활동 구현

활동은 @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실행 콘텍스트 단원을 참조하십시오.

활동을 수동으로 완료

위 예시의 @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); } }