2017-01-11 6 views
2

지난 몇 년 동안 Amazon SWF에서 상당한 작업을 수행했지만 다음과 같은 점은 여전히 ​​불분명하며 어떤 포럼에서도 정답을 찾을 수 없습니다.Amazon SWF 쿼리

이것은 내가 생각하기에 꽤 기본적인 요구 사항이며, 다른 사람들도 역시 눈에 might 수도 있습니다. 누군가가 이것을 분명히 할 수 있다면 좋을 것입니다.

  1. 워크 플로 실행 결과 (어쩌면 단지 부울처럼 단순한 무언가)를 워크 플로 스타터로 되돌릴 수있는 간단한 방법이 있습니까?
  2. Activity timeout 예외를 catch 할 수있는 방법이 있습니까? 그러면 그러한 시나리오에서 사용자 지정 작업을 실행할 수 있습니까?
  3. 왜 WorkflowExecutionHistory에 활동이 들어 있지 않은 이유는 무엇입니까?
  4. 워크 플로가 실패한 지점에서 워크 플로를 다시 시작하는 간단한 방법이없는 이유는 무엇입니까?

내 직장에서 더 많은 비즈니스 프로세스를 위해 SWF를 사용하려고하지만, 이러한 제한 사항이나 의문이 나를 기다리고 있습니다!

FINAL 작업 용액은

public class ReturnResultActivityImpl implements ReturnResultActivity { 

    SettableFuture future; 

    public ReturnResultActivityImpl() { 
    } 

    public ReturnResultActivityImpl(SettableFuture future) { 

     this.future = future; 
    } 

    public void returnResult(WorkflowResult workflowResult) { 

     System.out.print("Marking future as Completed"); 
     future.set(workflowResult); 
    } 

} 

public class WorkflowResult { 

    public WorkflowResult(boolean s, String n) { 
     this.success = s; 
     this.note = n; 
    } 

    private boolean success; 
    private String note; 
} 

public class WorkflowStarter { 

    @Autowired 
    ReturnResultActivityClient returnResultActivityClient; 

    @Autowired 
    DummyWorkflowClientExternalFactory dummyWorkflowClientExternalFactory; 

    @Autowired 
    AmazonSimpleWorkflowClient swfClient; 

    String domain = "test-domain; 
    boolean isRegister = true; 
    int days = 7; 
    int terminationTimeoutSeconds = 5000; 
    int threadPollCount = 2; 
    int taskExecutorThreadCount = 4; 

    public String testWorkflow() throws Exception { 

     SettableFuture<WorkflowResult> workflowResultFuture = SettableFuture.create(); 
     String taskListName = "testTaskList-" + RandomStringUtils.randomAlphabetic(8); 

     ReturnResultActivity activity = new ReturnResultActivityImpl(workflowResultFuture); 
     SpringActivityWorker activityWorker = buildReturnResultActivityWorker(taskListName, Arrays.asList(activity)); 

     DummyWorkflowClientExternalFactory factory = new DummyWorkflowClientExternalFactoryImpl(swfClient, domain); 
     factory.getClient().doSomething(taskListName) 

     WorkflowResult result = workflowResultSettableFuture.get(20, TimeUnit.SECONDS); 
     return "Call result note - " + result.getNote(); 
    } 

    public SpringActivityWorker buildReturnResultActivityWorker(String taskListName, List activityImplementations) 

      throws Exception { 

     return setupActivityWorker(swfClient, domain, taskListName, isRegister, days, activityImplementations, 
       terminationTimeoutSeconds, threadPollCount, taskExecutorThreadCount); 
    } 
} 

public class Workflow { 

    @Autowired 
    private DummyActivityClient dummyActivityClient; 

    @Autowired 
    private ReturnResultActivityClient returnResultActivityClient; 

    @Override 
    public void doSomething(final String resultActivityTaskListName) { 

     Promise<Void> activityPromise = dummyActivityClient.dummyActivity(); 
     returnResult(resultActivityTaskListName, activityPromise); 
    } 

    @Asynchronous 
    private void returnResult(final String taskListname, Promise waitFor) { 

     ActivitySchedulingOptions schedulingOptions = new ActivitySchedulingOptions(); 

     schedulingOptions.setTaskList(taskListname); 
     WorkflowResult result = new WorkflowResult(true,"All successful"); 

     returnResultActivityClient.returnResult(result, schedulingOptions); 
    } 
} 

답변

2
  1. 표준 패턴 결과를 제공하기 위해 사용되는 흐름 선발 과정에서 특별한 작업을 호스팅한다. 프로세스 별 작업 목록을 사용하여 프로세스 별 작업 목록이 올바른 스타터 인스턴스로 라우트되는지 확인하십시오. 다음은이를 구현하는 단계입니다.

    • 결과를 수신 할 활동을 정의하십시오. 예 : "returnResultActivity". 실행시 구현 자에게 전달 된 Future를 완료하려면이 액티비티 구현을 작성하십시오.
    • 워크 플로가 시작되면 입력 인수로 "resultActivityTaskList"를받습니다. 마지막에 워크 플로우는 워크 플로우 결과로이 활동을 호출합니다. 활동은 전달 된 작업 목록에서 예약됩니다.
    • 워크 플로 시작자는 ActivityWorker와 미래의 인스턴스를 만듭니다. 그런 다음 미래를 생성자 매개 변수로 사용하여 "returnResultActivity"의 인스턴스를 만듭니다.
    • 그런 다음 활동 인스턴스를 활동 작업자에 등록하고 임의로 생성 된 태스크 목록 이름으로 폴링하도록 구성합니다. 그런 다음 생성 된 작업 목록 이름을 입력 인수로 전달하여 "워크 플로 시작 작업"을 호출합니다.
    • 그런 다음 미래가 완료 될 때까지 기다립니다. future.get()은 워크 플로우 결과를 리턴합니다.
  2. 예, AWS Flow Framework를 사용하는 경우 활동 시간이 초과되면 시간 초과 예외가 발생합니다. Flow 프레임 워크를 사용하지 않는 경우 인생을 100 배 더 어렵게 만듭니다. BTW 워크 플로 시간 제한은 부모 워크 플로에 시간 초과 예외로도 throw됩니다. 타임 아웃 인스턴스 자체 내에서 워크 플로우 타임 아웃 예외를 포착하는 것은 불가능합니다. 이 경우 워크 플로 시간 제한에 의존하지 말고 일부 비즈니스 이벤트 시간이 초과 된 워크 플로 논리를 발생시키고 타이머를 생성하는 것이 좋습니다.

  3. 단일 활동 실행에는 여러 이벤트가 연관되어 있기 때문입니다. 역사를 자신이 좋아하는 활동의 표현으로 변환하는 코드를 작성하는 것은 꽤 쉬워야합니다.이러한 코드는 각 활동과 관련된 이벤트와 일치합니다. 각 이벤트는 항상 관련 이벤트에 대한 참조를 가지므로 더 높은 레벨 표현으로 쉽게 롤업 할 수 있습니다.

  4. 불행히도이 질문에 대한 쉬운 대답은 없습니다. 이상적으로 SWF는 실패 시점까지 기록을 복사하여 워크 플로를 다시 시작하는 것을 지원합니다. 그러나 그것은 지원되지 않습니다. 필자는 개인적으로 워크 플로우가 결코 실패하지 않는 방법으로 작성되어야한다고 믿지만 실패없이 항상 실패를 처리합니다. 분명히 예기치 않은 상황으로 인해 실패한 경우에는 작동하지 않습니다. 이 경우 작업 흐름을 처음부터 다시 시작할 수있는 방법으로 작성하는 것이 가장 간단한 방법입니다.

+0

감사합니다. Maxim. 1. 좀 더 자세히 설명해 주시겠습니까? 제안 된 접근법의 예가 있습니까? 2. 예, 이미 Flow를 사용하고 있습니다. Workflow timeout exception을 잡을 수 없었기 때문에, 나는 activity timeout이 작동하지 않을 것이라고 생각했다. 3. 돌아온 역사 이벤트 목록을 보면 상태가있는 활동으로 변환하는 간단한 방법을 생각할 수 없었습니다. 제안 된 접근법의 예가 있습니까? 4. 가지고 있으면 정말 유용했을 것이지만 지금은 적어도 내 자신의 방식으로 처리 할 수 ​​있다고 생각합니다. – Rana

+0

더 많은 정보로 답변을 업데이트했습니다. –

+0

좋아, 조금 복잡해 보이지만 제안을 구현하려고합니다. 확실하지 않은 몇 가지 사항 ...... 주어진 결과 ActivityTaskList, 워크 플로가 활동 클래스를 유지하는 방법은 무엇입니까? 워크 플로 스타터에서 Future 개체가 언제 준비되는지 알 수있는 방법은 무엇입니까? while (! future.isDone()) {Thread.sleep (10);} 그렇다면이 방법이 가장 효과적입니까? – Rana