HelloWorldWorkflow 애플리케이션 - AWS Flow Framework 자바용

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

HelloWorldWorkflow 애플리케이션

기본 HelloWorld예제는 워크플로우처럼 구성되어 있지만 다음과 같은 몇 가지 주요 측면에서 Amazon SWF 워크플로와 다릅니다.

기존 및 Amazon SWF 워크플로 애플리케이션
HelloWorld Amazon SWF 워크플로
로컬에서 단일 프로세스로 실행됩니다. Amazon EC2 인스턴스, 프라이빗 데이터 센터, 클라이언트 컴퓨터 등 여러 시스템 전반에 분산할 수 있는 여러 프로세스를 실행합니다. 동일한 운영 체제를 실행할 필요조차 없습니다.
활동은 완료될 때까지 차단되는 동기식 메서드입니다. 활동은 즉시 반환하고 워크플로에서 다른 작업을 수행함과 동시에 활동이 완료되기를 기다릴 수 있게 해주는 비동기식 메서드로 대표됩니다.
워크플로 작업자는 적절한 메서드를 호출하여 활동 작업자와 상호 작용합니다. 워크플로 작업자는 중간 역할을 하는 Amazon SWF와 함께 HTTP 요청을 사용하여 활동 작업자와 상호 작용합니다.
워크플로 작업자는 적절한 메서드를 호출하여 워크플로 작업자와 상호 작용합니다. 워크플로 시작자는 중간 역할을 하는 Amazon SWF와 함께 HTTP 요청을 사용하여 워크플로 작업자와 상호 작용합니다.

사용자는 예를 들어 워크플로 작업자가 웹 서비스 호출을 통해 직접 활동 작업자와 상호 작용하게 함으로써 처음부터 분산형 비동기식 워크플로 애플리케이션을 구현할 수 있습니다. 그러나 이때 여러 활동의 비동기식 실행을 관리하고 데이터 흐름을 처리하는 등의 작업에 필요한 모든 복잡한 코드를 구현해야 합니다. Java 및 Amazon AWS Flow Framework SWF용 SWF는 이러한 모든 세부 사항을 처리하므로 사용자는 비즈니스 로직을 구현하는 데 집중할 수 있습니다.

HelloWorldWorkflow Amazon SWF 워크플로로 HelloWorld 실행되는 수정된 버전입니다. 다음 그림은 이 두 애플리케이션의 작동 방식을 요약한 것입니다.

Hello World!의 기존 및 Amazon SWF 버전

HelloWorld 단일 프로세스로 실행되며 스타터, 워크플로 작업자 및 활동 작업자는 일반적인 메서드 호출을 사용하여 상호 작용합니다. HelloWorldWorkflow를 사용하면 시작자, 워크플로 작업자 및 활동 작업자는 HTTP 요청을 사용하여 Amazon SWF를 통해 상호 작용하는 분산 구성 요소입니다. Amazon SWF는 워크플로 및 활동 작업 목록을 유지 관리하여 상호 작용을 관리하고, 각 구성 요소에 전달합니다. 이 섹션에서는 프레임워크의 작동 방식을 설명합니다 HelloWorldWorkflow.

HelloWorldWorkflow 는 AWS Flow Framework for Java API를 사용하여 구현됩니다. 이 API는 백그라운드에서 Amazon SWF와 상호 작용하는 복잡한 세부 사항을 처리하고 개발 프로세스를 상당히 단순화합니다. 이전에 사용했던 것과 동일한 프로젝트를 사용할 수 있습니다. 이 프로젝트는 이미 HelloWorld Java 애플리케이션용으로 AWS Flow Framework 구성되어 있습니다. 그러나 애플리케이션을 실행하려면 다음과 같이 Amazon SWF 계정을 설정해야 합니다.

  • 아직 AWS 계정이 없는 경우 Amazon Web Services에서 계정을 등록하십시오.

  • 계정의 액세스 ID 및 보안 ID를 AWS_ACCESS_KEY_ID 및 AWS_SECRET_KEY 환경 변수에 각각 지정합니다. 코드에 리터럴 키 값을 노출하지 않는 것이 좋습니다. 그 값을 환경 변수에 저장해두면 관리하기가 편합니다.

  • Amazon Simple Workflow Service에서 Amazon SWF 계정에 가입하십시오.

  • 에 AWS Management Console 로그인하고 Amazon SWF 서비스를 선택합니다.

  • 상단 오른쪽 모서리에 있는 도메인 관리를 선택하고 새 Amazon SWF 도메인을 등록합니다. 도메인은 워크플로 및 활동 유형, 워크플로 실행과 같은 애플리케이션 리소스를 위한 논리적 컨테이너입니다. 편리한 도메인 이름은 아무거나 사용할 수 있지만, 안내에서는 "“를 사용합니다. helloWorldWalkthrough

를 구현하려면 HelloWorld의 복사본을 만드십시오. HelloWorldWorkflow HelloWorld 프로젝트 디렉터리에 패키지를 넣고 이름을 HelloWorld로 지정합니다. HelloWorldWorkflow. 다음 섹션에서는 AWS Flow Framework Java용 를 사용하고 Amazon SWF 워크플로 애플리케이션으로 실행하도록 원본 HelloWorld 코드를 수정하는 방법을 설명합니다.

HelloWorldWorkflow 액티비티 워커

HelloWorld 액티비티 워커를 단일 클래스로 구현했습니다. AWS Flow Framework for Java 액티비티 워커에는 다음과 같은 세 가지 기본 구성 요소가 있습니다.

  • 실제 작업을 수행하는 활동 메서드는 인터페이스에서 정의되고 관련 클래스에서 구현됩니다.

  • ActivityWorker클래스는 액티비티 메서드와 Amazon SWF 간의 상호 작용을 관리합니다.

  • 활동 호스트 애플리케이션에서는 활동 작업자를 등록 및 시작하고 정리 작업을 처리합니다.

이 단원에서는 활동 메서드를 다룹니다. 다른 두 클래스는 나중에 설명합니다.

HelloWorldWorkflow 에서 GreeterActivities 다음과 같이 액티비티 인터페이스를 정의합니다.

import com.amazonaws.services.simpleworkflow.flow.annotations.Activities; import com.amazonaws.services.simpleworkflow.flow.annotations.ActivityRegistrationOptions; @ActivityRegistrationOptions(defaultTaskScheduleToStartTimeoutSeconds = 300, defaultTaskStartToCloseTimeoutSeconds = 10) @Activities(version="1.0") public interface GreeterActivities { public String getName(); public String getGreeting(String name); public void say(String what); }

이 인터페이스가 꼭 필요한 것은 아니지만 Java HelloWorld 애플리케이션용으로는 AWS Flow Framework 사용할 수 있습니다. 인터페이스 정의 자체는 변결되지 않았다는 점에 유의하십시오. 하지만 Java 주석에는 두 개를, @ActivityRegistrationOptions 인터페이스 정의에는 두 개를 AWS Flow Framework 적용해야 합니다. @활동 주석은 구성 정보를 제공하고 AWS Flow Framework Java용 주석 프로세서가 인터페이스 정의를 사용하여 활동 클라이언트 클래스를 생성하도록 지시합니다. 이에 대해서는 나중에 설명합니다.

@ActivityRegistrationOptions활동의 동작을 구성하는 데 사용되는 여러 개의 명명된 값이 있습니다. HelloWorldWorkflow 두 개의 타임아웃을 지정합니다.

  • defaultTaskScheduleToStartTimeoutSeconds에서는 활동 작업에서 작업이 얼마나 오래 대기 상태에 있을 수 있는지 지정하며 300초(5분)로 설정됩니다.

  • defaultTaskStartToCloseTimeoutSeconds에서는 활동에서 작업을 수행하는 데 걸릴 수 있는 최대 시간을 지정하며 10초로 설정됩니다.

이 제한 시간을 통해 활동에서는 자체 작업을 적당한 시간 내에 완료할 수 있게 됩니다. 두 제한 시간 중 어느 하나라도 초과되면 프레임워크에서는 오류를 생성하고 워크플로 작업자는 이 문제를 어떻게 처리할지 결정해야 합니다. 그러한 오류를 처리하는 방법에 관한 설명은 오류 처리 단원을 참조하십시오.

@Activities에는 몇 가지 값이 있지만 일반적으로 활동의 버전 번호를 지정할 뿐입니다. 이를 통해 사용자는 활동 구현을 여러 세대에 걸쳐 추적할 수 있습니다. Amazon SWF에서 이 번호를 등록한 후에 @ActivityRegistrationOptions 값 변경을 비롯해 활동 인터페이스를 변경하는 경우에는 새 버전 번호를 사용해야 합니다.

HelloWorldWorkflow 에서 GreeterActivitiesImpl 다음과 같이 활동 메서드를 구현합니다.

public class GreeterActivitiesImpl implements GreeterActivities { @Override public String getName() { return "World"; } @Override public String getGreeting(String name) { return "Hello " + name; } @Override public void say(String what) { System.out.println(what); } }

코드가 HelloWorld 구현과 동일하다는 점에 유의하세요. 기본적으로 AWS Flow Framework 액티비티는 일부 코드를 실행하고 결과를 반환하는 메서드일 뿐입니다. 표준 애플리케이션과 Amazon SWF 워크플로 애플리케이션 간의 차이는 워크플로에서 활동을 실행하는 방식, 활동이 실행되는 위치 및 결과가 워크플로 작업자에게 반환되는 방식에 있습니다.

HelloWorldWorkflow 워크플로 워커

Amazon SWF 워크플로 작업자에는 세 가지 기본 구성 요소가 있습니다.

  • 워크플로 관련 작업을 수행하는 클래스인 워크플로 구현

  • 기본적으로 활동 클래스의 프록시이며 워크플로 구현에서 활동 메서드를 비동기식으로 실행하는 데 사용하는 활동 클라이언트 클래스

  • 워크플로와 Amazon SWF 간의 상호 작용을 관리하는 WorkflowWorker클래스입니다.

이 단원에서는 워크플로 구현 및 활동 클라이언트를 다룹니다. WorkflowWorker 클래스는 나중에 설명합니다.

HelloWorldWorkflow 에서 GreeterWorkflow 다음과 같이 워크플로 인터페이스를 정의합니다.

import com.amazonaws.services.simpleworkflow.flow.annotations.Execute; import com.amazonaws.services.simpleworkflow.flow.annotations.Workflow; import com.amazonaws.services.simpleworkflow.flow.annotations.WorkflowRegistrationOptions; @Workflow @WorkflowRegistrationOptions(defaultExecutionStartToCloseTimeoutSeconds = 3600) public interface GreeterWorkflow { @Execute(version = "1.0") public void greet(); }

이 인터페이스도 Java 응용 프로그램에 꼭 필요한 것은 HelloWorld 아니지만 Java 응용 프로그램에는 AWS Flow Framework 필수적입니다. Java 주석에는 두 개를, @워크플로 워크플로 인터페이스 정의에는 두 개를 AWS Flow Framework 적용해야 합니다. @WorkflowRegistrationOptions 주석은 구성 정보를 제공하고 나중에 설명하겠지만 AWS Flow Framework Java용 주석 프로세서가 인터페이스를 기반으로 워크플로 클라이언트 클래스를 생성하도록 지시합니다.

@Workflow에는 DataConverter라는 선택적 매개 변수가 하나 있는데, 이 매개 변수는 종종 기본값과 함께 사용되는데 NullDataConverter, 이는 사용해야 함을 나타냅니다. JsonDataConverter

@WorkflowRegistrationOptions에는 워크플로 작업자를 구성하는 데 사용할 수 있는 여러 가지 선택적 파라미터도 있습니다. 여기서는 워크플로를 실행할 수 있는 시간을 지정하는 defaultExecutionStartToCloseTimeoutSeconds를 3600초(1시간)로 설정합니다.

GreeterWorkflow인터페이스 정의는 주석이라는 한 가지 중요한 HelloWorld 측면에서 다릅니다. @실행 워크플로 인터페이스에서는 워크플로 시작자와 같이 애플리케이션에서 호출할 수 있고 각기 특별한 역할이 있는 소수의 메서드로 제한된 메서드를 지정합니다. 프레임워크에서는 워크플로 인터페이스 메서드에 이름 또는 파라미터 목록을 지정하지 않습니다. 따라서 워크플로에 적합한 이름과 파라미터 목록을 사용하고 AWS Flow Framework for Java 주석을 첨부하여 메서드의 역할을 파악해야 합니다.

@Execute의 용도는 다음 두 가지입니다.

  • greet를 워크플로의 진입점, 즉 워크플로 시작자가 워크플로를 시작하기 위해 호출하는 메서드로 식별합니다. 일반적으로 진입점에서는 파라미터를 한 개 이상 받아들이는데, 이를 통해 시작자는 워크플로를 초기화할 수 있습니다. 그러나 이 예시에서는 초기화할 필요가 없습니다.

  • 워크플로의 버전 번호를 지정합니다. 이를 통해 사용자는 활동 구현을 여러 세대에 걸쳐 추적할 수 있습니다. Amazon SWF에서 이 번호를 등록한 후에 제한 시간 값 변경을 비롯해 워크플로 인터페이스를 변경하려면 새 버전 번호를 사용해야 합니다.

워크플로 인터페이스에 포함될 수 있는 기타 메서드에 대한 자세한 내용은 워크플로 및 활동 계약 단원을 참조하십시오.

HelloWorldWorkflow 다음과 같이 워크플로를 구현합니다. GreeterWorkflowImpl

import com.amazonaws.services.simpleworkflow.flow.core.Promise; public class GreeterWorkflowImpl implements GreeterWorkflow { private GreeterActivitiesClient operations = new GreeterActivitiesClientImpl(); public void greet() { Promise<String> name = operations.getName(); Promise<String> greeting = operations.getGreeting(name); operations.say(greeting); } }

코드는 과 HelloWorld 비슷하지만 두 가지 중요한 차이점이 있습니다.

  • GreeterWorkflowImpl에서는 GreeterActivitiesImpl 대신에 활동 클라이언트인 GreeterActivitiesClientImpl의 인스턴스를 생성하고 클라이언트 객체에 있는 메서드를 호출하여 활동을 실행합니다.

  • 이름과 인사 활동에서는 String 객체 대신에 Promise<String> 객체를 반환합니다.

HelloWorld 단일 프로세스로 로컬에서 실행되는 표준 Java 응용 프로그램이므로 간단히 인스턴스를 만들고 메서드를 순서대로 호출한 다음 한 액티비티의 반환 값을 다음 액티비티로 전달하여 워크플로 토폴로지를 구현할 GreeterWorkflowImpl 수 있습니다. GreeterActivitiesImpl Amazon SWF 워크플로에서 활동의 작업은 여전히 GreeterActivitiesImpl의 활동 메서드에서 수행합니다. 그러나 이 메서드는 워크플로와 동일한 프로세스로 실행될 필요가 없고 심지어는 동일 시스템에서 실행되지 않아도 됩니다. 워크플로에서는 활동을 비동기식으로 실행해야 합니다. 이러한 요구 사항에 따라 다음 문제가 제기됩니다.

  • 다른 프로세스(다른 시스템일 수도 있음)에서 실행 중일 수 있는 활동 메서드를 실행하는 방법

  • 활동 메서드를 비동기식으로 실행하는 방법

  • 활동의 입력 및 반환 값을 관리하는 방법. 예를 들어 활동 A의 반환 값이 활동 B에게는 입력인 경우에는 활동 A가 완료될 때까지 활동 B가 실행되지 않게 해야 합니다.

활동 클라이언트 및 Promise<T>와 결합된 친숙한 Java 흐름 제어를 사용하여 애플리케이션의 제어를 통해 다양한 워크플로 토폴로지를 구현할 수 있습니다.

활동 클라이언트

GreeterActivitiesClientImpl은 기본적으로 GreeterActivitiesImpl의 프록시로서, 워크플로 구현에서 GreeterActivitiesImpl 메서드를 비동기식으로 실행할 수 있게 해줍니다.

GreeterActivitiesClientGreeterActivitiesClientImpl 클래스는 사용자의 GreeterActivities 클래스에 첨부된 주석의 정보를 사용하여 자동으로 생성됩니다. 따라서 사용자는 이를 직접 구현하지 않아도 됩니다.

참고

Eclipse에서는 사용자가 프로젝트를 저장할 때 이 클래스를 생성합니다. 생성된 코드는 프로젝트 디렉터리의 .apt_generated 하위 디렉터리에서 볼 수 있습니다.

GreeterWorkflowImpl 클래스의 컴파일 오류를 방지하려면 .apt_generated 디렉터리를 Java Build Path 대화 상자의 Order and Export 탭 상단으로 이동하는 것이 좋습니다.

워크플로 작업자는 해당되는 클라이언트 메서드를 호출하여 활동을 실행합니다. 이 메서드는 비동기식이며 Promise<T> 객체를 즉시 반환합니다. 여기에서 T는 활동의 반환 유형입니다. 반환된 Promise<T> 객체는 기본적으로 활동 메서드에서 최종적으로 반환할 값의 자리 표시자입니다.

  • 활동 클라이언트 메서드에서 값을 반환하면 Promise<T> 객체는 초기에는 준비되지 않은 상태인데, 이는 아직 객체에서 유효한 반환 값을 표시하지 않고 있음을 뜻합니다.

  • 상응하는 활동 메서드가 작업을 완료하고 값을 반환하면 프레임워크에서는 이 반환 값을 Promise<T> 객체에 할당하고 이 객체를 준비 상태로 둡니다.

Promise<T> 유형

Promise<T> 객체의 기본 목적은 비동기 구성 요소 간 데이터 흐름을 관리하고 이 구성 요소가 실행되는 시점을 제어하는 것입니다. 이 객체는 애플리케이션에서 동기화를 명시적으로 관리하거나 타이머와 같은 메커니즘에 의존해야 할 필요를 없애줌으로써 비동기 구성 요소가 조기에 실행되지 않도록 합니다. 활동 클라이언트 메서드를 호출하면 이 메서드에서는 즉시 값을 반환하지만 프레임워크에서는 입력 Promise<T> 객체 중 어느 하나라도 완료되어 유효한 데이터를 표시할 때까지 해당 활동 메서드 실행을 연기합니다.

GreeterWorkflowImpl의 관점에서 보면 세 가지 활동 클라이언트 메서드 모두 즉시 값을 반환합니다. GreeterActivitiesImpl의 관점에서 보면 프레임워크에서는 name이 완료될 때까지 getGreeting을 호출하지 않고 getGreeting이 완료될 때까지 say를 호출하지 않습니다.

HelloWorldWorkflowPromise<T>를 사용하여 한 활동에서 그다음 활동으로 데이터를 전달함으로써 활동 메서드에서 잘못된 데이터를 사용하지 않도록 할 뿐 아니라 활동에서 워크플로 토폴로지를 실행하고 암묵적으로 정의하는 시점을 제어합니다. 각 활동의 Promise<T> 반환 값을 그다음 활동에 전달하려면 활동이 순차적으로 실행되어 앞서 설명한 선형 토폴로지를 정의해야 합니다. Java의 경우 복잡한 토폴로지를 정의하는 데 특별한 모델링 코드를 사용할 필요가 없습니다. 표준 Java 흐름 제어 및 AWS Flow Framework 기능만 있으면 됩니다. Promise<T> 간단한 병렬 토폴로지를 구현하는 방법을 보여주는 예시는 HelloWorldWorkflowParallel 활동 작업자 단원을 참조하십시오.

참고

say와 같은 활동 메서드에서 값을 반환하지 않으면 상응하는 클라이언트 메서드에서 Promise<Void> 객체를 반환합니다. 객체에서는 데이터를 표시하지 않고 초기에는 준비되지 않은 상태였다가 활동이 완료되면 준비 상태가 됩니다. 따라서 Promise<Void> 객체를 다른 활동 클라이언트 메서드에 전달하여 이 메서드에서 원본 활동이 완료될 때까지 실행을 연기하도록 할 수 있습니다.

Promise<T>를 통해 워크플로 구현에서는 활동 클라이언트 메서드와 그 반환 값을 비동기식 메서드와 흡사하게 사용합니다. 그러나 Promise<T> 객체의 값에 액세스할 때는 주의해야 합니다. Java Future<T> 유형과 달리 이 프레임워크에서는 애플리케이션이 아닌 Promise<T>를 위해 동기화를 처리합니다. Promise<T>.get을 직접적으로 호출하였는데 객체가 준비 상태가 아니면 get에서 예외가 발생합니다. HelloWorldWorkflow에서는 Promise<T> 객체에 직접 액세스하지 않고 객체를 한 활동에서 그다음 활동으로 전달하기만 합니다. 객체가 준비 상태가 되면 프레임워크에서는 값을 추출하여 이를 활동 메서드에 표준 유형으로 전달합니다.

Promise<T> 객체는 비동기식 코드를 통해서만 액세스해야 합니다. 이때 프레임워크에서는 이 객체가 준비 상태가 되어 유효한 값을 표시하도록 보장합니다. HelloWorldWorkflow에서는 Promise<T> 객체를 활동 클라이언트 메서드로만 전달하여 이 문제를 처리합니다. 활동과 매우 유사하게 동작하는 비동기 워크플로 메서드에 객체를 전달하여 워크플로 구현에서 Promise<T> 객체 값에 액세스할 수 있습니다. 예는 HelloWorldWorkflowAsync 애플리케이션를 참조하세요.

HelloWorldWorkflow 워크플로우 및 활동 구현

워크플로우 및 활동 구현에는 관련 작업자 클래스가 ActivityWorker있으며 WorkflowWorker, 이 클래스에서는 작업에 대한 적절한 Amazon SWF 작업 목록을 폴링하고 각 작업에 대해 적절한 메서드를 실행하며 데이터 흐름을 관리하여 Amazon SWF와 활동 및 워크플로 구현 간 통신을 처리합니다. 자세한 내용은 AWS Flow Framework 기본 개념: 애플리케이션 구조을 참조하세요.

활동 및 워크플로 구현을 상응하는 작업자 객체에 연결하려면 다음 작업을 수행하는 작업자 애플리케이션을 한 개 이상 구현해야 합니다.

  • Amazon SWF에 워크플로 또는 활동 등록

  • 작업자 객체를 생성하여 이를 워크플로 또는 활동 작업자 구현에 연결

  • 작업자 객체에게 Amazon SWF와의 통신을 시작하도록 지시

워크플로 및 활동을 별도 프로세스로 실행하고 싶다면 별도 워크플로 및 활동 작업자 호스트를 구현해야 합니다. 예는 HelloWorldWorkflowDistributed 애플리케이션를 참조하세요. 단순화를 위해 다음과 같이 동일한 프로세스에서 활동과 워크플로 작업자를 실행하는 단일 작업자 호스트를 HelloWorldWorkflow 구현합니다.

import com.amazonaws.ClientConfiguration; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflow; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowClient; import com.amazonaws.services.simpleworkflow.flow.ActivityWorker; import com.amazonaws.services.simpleworkflow.flow.WorkflowWorker; public class GreeterWorker { public static void main(String[] args) throws Exception { ClientConfiguration config = new ClientConfiguration().withSocketTimeout(70*1000); String swfAccessId = System.getenv("AWS_ACCESS_KEY_ID"); String swfSecretKey = System.getenv("AWS_SECRET_KEY"); AWSCredentials awsCredentials = new BasicAWSCredentials(swfAccessId, swfSecretKey); AmazonSimpleWorkflow service = new AmazonSimpleWorkflowClient(awsCredentials, config); service.setEndpoint("https://swf.us-east-1.amazonaws.com"); String domain = "helloWorldWalkthrough"; String taskListToPoll = "HelloWorldList"; ActivityWorker aw = new ActivityWorker(service, domain, taskListToPoll); aw.addActivitiesImplementation(new GreeterActivitiesImpl()); aw.start(); WorkflowWorker wfw = new WorkflowWorker(service, domain, taskListToPoll); wfw.addWorkflowImplementationType(GreeterWorkflowImpl.class); wfw.start(); } }

GreeterWorker에는 해당 클래스가 없으므로 프로젝트에 이름이 지정된 GreeterWorker Java 클래스를 추가하고 예제 코드를 해당 파일에 복사해야 합니다. HelloWorld

첫 번째 단계는 기본 Amazon SWF 서비스 메서드를 호출하는 AmazonSimpleWorkflowClient객체를 만들고 구성하는 것입니다. 이렇게 하려면 GreeterWorker에서 다음 작업을 수행해야 합니다.

  1. ClientConfiguration객체를 생성하고 소켓 제한 시간을 70초로 지정합니다. 이 값을 통해 수립된 개방 연결을 통해 데이터가 전송될 때까지 기다리는 시간을 지정합니다. 이 시간이 지나면 소켓이 닫힙니다.

  2. AWS 계정을 식별하는 Basic AWSCredentials 객체를 만들고 생성자에 계정 키를 전달합니다. 편의상, 또한 코드에서 이 키를 일반 텍스트로 노출하지 않도록 하기 위해 키는 환경 변수로 저장됩니다.

  3. 워크플로를 나타내는 AmazonSimpleWorkflowClient객체를 만들고, BasicAWSCredentialsClientConfiguration 객체를 생성자에 전달합니다.

  4. 클라이언트 객체의 서비스 엔드포인트 URL을 설정합니다. Amazon SWF는 현재 모든 AWS 지역에서 사용할 수 있습니다.

편의상 GreeterWorker에서는 두 가지 문자열 상수를 정의합니다.

  • domainAmazon SWF 계정을 설정할 때 만든 워크플로의 아마존 SWF 도메인 이름입니다. HelloWorldWorkflow워크플로를 "" helloWorldWalkthrough 도메인에서 실행한다고 가정합니다.

  • taskListToPoll은 Amazon SWF에서 워크플로와 활동 작업자 간 통신을 관리하는 데 사용하는 작업 목록의 이름입니다. 사용자는 이 이름을 원하는 문자열로 자유롭게 설정할 수 있습니다. HelloWorldWorkflow 워크플로 및 활동 작업 목록 모두에 HelloWorldList "“를 사용합니다. 백그라운드에서는 이름이 여러 가지 네임스페이스가 되므로 두 작업 목록은 서로 구분됩니다.

GreeterWorker문자열 상수와 객체를 사용하여 작업자 AmazonSimpleWorkflowClient객체를 생성하며, 이 작업자 객체는 활동과 작업자 구현 및 Amazon SWF 간의 상호 작용을 관리합니다. 특히 작업자 객체에서는 작업에 대해 적절한 작업 목록을 폴링하는 작업을 처리합니다.

GreeterWorker에서는 ActivityWorker 객체를 생성하고 새 클래스 인스턴스를 추가하여 이 객체에서 GreeterActivitiesImpl을 처리하도록 구성합니다. 그러면 GreeterWorker에서 ActivityWorker 객체의 start 메서드를 호출하고, 이를 통해 객체에게 지정된 활동 작업 목록을 폴링하도록 지시합니다.

GreeterWorker에서는 WorkflowWorker 객체를 생성하고 GreeterWorkflowImpl.class라는 새 클래스 파일 이름을 추가하여 이 객체에서 GreeterWorkflowImpl을 처리하도록 구성합니다. 그러면 이 객체에서는 WorkflowWorker 객체의 start 메서드를 호출하고, 이를 통해 객체에게 지정된 워크플로 작업 목록을 폴링하도록 지시합니다.

이 시점에서 사용자는 GreeterWorker를 성공적으로 실행할 수 있습니다. 이를 실행하면 Amazon SWF에 워크플로 및 활동을 등록하고 각자에게 해당되는 작업 목록을 폴링하는 작업자 객체를 시작합니다. 이를 확인하려면 GreeterWorker를 실행하고 Amazon SWF 콘솔로 이동하여 도메인 목록에서 helloWorldWalkthrough를 선택합니다. 탐색 창에서 워크플로 유형을 선택하면 GreeterWorkflow.greet이 표시됩니다.

HelloWorldWorkflow 워크플로 유형

[Activity Types]를 선택하면 다음과 같이 GreeterActivities 메서드가 표시됩니다.

HelloWorldWorkflow 활동 유형

그러나 [Workflow Executions]를 선택하면 활성화된 실행이 표시되지 않습니다. 워크플로 및 활동 작업자가 작업에 대해 폴링 중이지만 아직 우리는 워크플로 실행을 시작한 것은 아닙니다.

HelloWorldWorkflow 스타터

퍼즐의 마지막 조각은 워크플로 실행을 시작하는 애플리케이션인 워크플로 시작자를 구현하는 것입니다. 실행 상태는 Amazon SWF에서 저장하므로 사용자는 그 내역과 실행 상태를 볼 수 있습니다. HelloWorldWorkflow 다음과 같이 GreeterMain 클래스를 수정하여 워크플로 스타터를 구현합니다.

import com.amazonaws.ClientConfiguration; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflow; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowClient; public class GreeterMain { public static void main(String[] args) throws Exception { ClientConfiguration config = new ClientConfiguration().withSocketTimeout(70*1000); String swfAccessId = System.getenv("AWS_ACCESS_KEY_ID"); String swfSecretKey = System.getenv("AWS_SECRET_KEY"); AWSCredentials awsCredentials = new BasicAWSCredentials(swfAccessId, swfSecretKey); AmazonSimpleWorkflow service = new AmazonSimpleWorkflowClient(awsCredentials, config); service.setEndpoint("https://swf.us-east-1.amazonaws.com"); String domain = "helloWorldWalkthrough"; GreeterWorkflowClientExternalFactory factory = new GreeterWorkflowClientExternalFactoryImpl(service, domain); GreeterWorkflowClientExternal greeter = factory.getClient("someID"); greeter.greet(); } }

GreeterMain에서는 GreeterWorker와 동일한 코드를 사용하여 AmazonSimpleWorkflowClient 객체를 생성합니다. 그런 다음 GreeterWorkflowClientImpl에서 생성된 활동 클라이언트가 활동 메서드에 대해 프록시 역할을 수행하는 것과 흡사한 방식으로 워크플로에 대해 프록시 역할을 수행하는 GreeterWorkflowClientExternal 객체를 생성합니다. 사용자는 new를 사용해 워크플로 클라이언트 객체를 생성하는 대신에 다음 작업을 수행해야 합니다.

  1. 외부 클라이언트 팩토리 객체를 생성하고 AmazonSimpleWorkflowClient 객체와 Amazon SWF 도메인 이름을 생성자에게 전달합니다. 클라이언트 팩토리 객체는 프레임워크의 주석 처리기에 의해 생성되며, 주석 처리기는 워크플로 인터페이스 이름에 ClientExternalFactoryImpl "“를 추가하기만 하면 객체 이름이 만들어집니다.

  2. 팩토리 개체의 메서드를 호출하여 외부 클라이언트 개체를 만듭니다. 이 getClient 메서드는 워크플로 인터페이스 이름에 ClientExternal "“를 추가하여 개체 이름을 만듭니다. 사용자는 Amazon SWF에서 이러한 워크플로 인스턴스를 식별하는 데 사용할 문자열을 getClient에 선택적으로 전달할 수 있습니다. 또는 Amazon SWF에서는 생성된 GUID를 사용하여 워크플로 인스턴스를 표시합니다.

팩토리에서 반환된 클라이언트에서는 getClient 메서드로 전달된 문자열로 이름이 지정된 워크플로만 생성합니다(팩토리에서 반환된 클라이언트는 이미 Amazon SWF에 상태가 있음). 다른 ID로 워크플로를 실행하려면 팩토리로 돌아가 그 ID가 지정된 새 클라이언트를 생성해야 합니다.

greet()@Execute 주석이 지정된 메서드였으므로 워크플로 클라이언트에서는 워크플로를 시작하기 위해 GreeterMain에서 호출하는 greet 메서드를 노출합니다.

참고

또한 주석 프로세서에서는 하위 워크플로를 생성하는 데 사용되는 내부 클라이언트 팩토리 객체를 생성합니다. 자세한 내용은 하위 워크플로 실행 섹션을 참조하세요.

GreeterWorker가 여전히 실행 중인 경우 이를 잠시 종료하고 GreeterMain을 실행합니다. 이제 활성화된 워크플로 실행의 Amazon SWF 콘솔 목록에 다음과 같은 someID가 표시될 것입니다.

HelloWorldWorkflow 워크플로 실행

[someID]를 선택하고 [Events] 탭을 선택하면 다음과 같이 이벤트가 표시됩니다.

HelloWorldWorkflow 초기 워크플로우 이벤트
참고

앞서 GreeterWorker를 시작하여 아직 실행 중이라면 사유를 짧막하게 설명한 더 긴 이벤트 목록이 표시됩니다. GreeterWorker 중지 후 GreaterMain을 다시 실행합니다.

[Events]에는 다음과 같이 이벤트 두 건만 표시됩니다.

  • WorkflowExecutionStarted에서는 워크플로에서 실행이 시작되었음을 나타냅니다.

  • DecisionTaskScheduled에서는 Amazon SWF가 첫 번째 결정 작업을 대기열에 추가했음을 나타냅니다.

첫 번째 결정 작업에서 워크플로가 차단된 이유는 워크플로가 GreeterMainGreeterWorker 두 애플리케이션에 분산되었기 때문입니다. GreeterMain에서는 워크플로 실행을 시작하였으나 GreeterWorker는 실행되고 있지 않으므로 작업자는 목록 폴링 및 작업 수행을 하지 않고 있습니다. 두 애플리케이션 중 하나를 실행할 수 있지만 워크플로 실행이 첫 번째 결정 작업 단계를 넘어 계속 진행되도록 하려면 둘 다 필요합니다. 이제 GreeterWorker를 실행하면 워크플로 및 활동 작업자에서는 폴링이 시작되고 여러 작업이 신속하게 완료됩니다. 이제 Events 탭을 확인하면 이벤트의 첫 번째 배치가 표시됩니다.

HelloWorldWorkflow 전체 워크플로우 이벤트

개별 이벤트를 선택하면 추가 정보를 얻을 수 있습니다. 확인을 마쳤을 때쯤에는 워크플로가 "Hello World!"를 콘솔에 출력했어야 합니다.

워크플로는 완료된 후에는 활성 실행 목록에 더 이상 표시되지 않습니다. 그러나 이를 다시 보고 싶다면 [Closed] 실행 상태 버튼을 선택한 후 [List Executions]를 선택하면 됩니다. 이렇게 하면 도메인을 생성할 때 지정한 보존 시간을 초과하지 않은, 지정 도메인(helloWorldWalkthrough) 내의 완료된 워크플로 인스턴스가 모두 표시됩니다.

HelloWorldWorkflow 완료된 워크플로

각 워크플로 인스턴스에는 고유한 [Run ID] 값이 있다는 점에 유의하십시오. 다른 워크플로 인스턴스에 대해 동일한 실행 ID를 사용할 수 있습니다. 단, 한 번에 하나의 활성화된 실행에만 사용할 수 있습니다.