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

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

HelloWorldWorkflowDistributed 애플리케이션

HelloWorldWorkflow 및 HelloWorldWorkflowAsync의 경우 Amazon SWF가 워크플로 및 활동 구현 간 상호 작용을 조정하지만 로컬에서 단일 프로세스로 실행됩니다. GreeterMain은 별도 프로세스에 있지만 여전히 동일한 시스템에서 실행됩니다.

Amazon SWF의 주요 특징은 분산 애플리케이션을 지원한다는 것입니다. 예를 들어 사용자는 Amazon EC2 인스턴스에서 워크플로 작업자, 데이터 센터 컴퓨터에서 워크플로 시작자를, 그리고 클라이언트 데스크톱 컴퓨터에서 활동을 실행할 수 있습니다. 시스템마다 다른 활동을 실행하는 것도 가능합니다.

HelloWorldWorkflowDistributed 애플리케이션에서는 HelloWorldWorkflowAsync를 확장하여 두 시스템 및 세 가지 프로세스 전체에 걸쳐 애플리케이션을 분산합니다.

  • 워크플로와 워크플로 시작자는 한 가지 시스템에서 별도 프로세스로 실행됩니다.

  • 활동은 별도 시스템에서 실행됩니다.

애플리케이션을 구현하려면 프로젝트 디렉터리에 helloWorld.HelloWorldWorkflowAsync 패키지의 사본을 생성하고 이 사본의 이름을 helloWorld.HelloWorldWorkflowDistributed로 지정합니다. 다음 단원에서는 원본 HelloWorldWorkflowDistributedAsync 코드를 수정하여 두 시스템 및 세 가지 프로세스 전체에 걸쳐 애플리케이션을 분산하는 방법을 설명합니다.

별도 시스템에서 실행하기 위해 워크플로 또는 활동 구현을 변경하지 않아도 됩니다. 버전 번호도 변경할 필요가 없습니다. 또한 GreeterMain도 수정할 필요가 없습니다. 활동 및 워크플로 호스트만 변경하면 됩니다.

HelloWorldWorkflowAsync의 경우 단일 애플리케이션은 워크플로 및 활동 호스트의 역할을 합니다. 워크플로 및 활동 구현을 별도의 시스템에서 실행하려면 별도의 애플리케이션을 구현해야 합니다. 프로젝트에서 GreeterWorker를 삭제하고 새 클래스 파일 두 개, 즉 GreeterWorkflowWorker 및 GreeterActivitiesWorker를 추가합니다.

HelloWorldWorkflowDistributed에서는 다음과 같이 GreeterActivitiesWorker에서 활동 호스트를 구현합니다.

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; public class GreeterActivitiesWorker { 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 = "helloWorldExamples"; String taskListToPoll = "HelloWorldAsyncList"; ActivityWorker aw = new ActivityWorker(service, domain, taskListToPoll); aw.addActivitiesImplementation(new GreeterActivitiesImpl()); aw.start(); } }

HelloWorldWorkflowDistributed에서는 다음과 같이 GreeterWorkflowWorker에서 워크플로 호스트를 구현합니다.

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.WorkflowWorker; public class GreeterWorkflowWorker { 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 = "helloWorldExamples"; String taskListToPoll = "HelloWorldAsyncList"; WorkflowWorker wfw = new WorkflowWorker(service, domain, taskListToPoll); wfw.addWorkflowImplementationType(GreeterWorkflowImpl.class); wfw.start(); } }

GreeterActivitiesWorker는 단지 WorkflowWorker 코드가 없는 GreeterWorker이고, GreeterWorkflowWorker는 단지 ActivityWorker 코드가 없는 GreeterWorker입니다.

워크플로 실행 방법:
  1. GreeterActivitiesWorker가 있는 실행 가능 JAR 파일을 진입점으로 생성합니다.

  2. 1단계의 JAR 파일을 Java를 지원하는 운영 체제를 실행 중일 수 있는 다른 시스템으로 복사합니다.

  3. 동일한 Amazon SWF 도메인에 액세스할 권한이 있는 AWS 보안 인증이 다른 시스템에서 사용 가능한지 확인합니다.

  4. JAR 파일을 실행합니다.

  5. 개발 시스템에서 이클립스를 사용하여 GreeterWorkflowWorkerGreeterMain을 실행합니다.

활동이 워크플로 작업자 및 워크플로 시작자가 아닌 시스템에서 실행된다는 사실 외에 워크플로는 HelloWorldAsync와 똑같은 방식으로 작동합니다. 그러나 콘솔에 "Hello World!"를 출력하는 println 직접 호출이 say 활동에 있으므로 출력은 활동 작업자를 실행 중인 시스템에 표시합니다.