지난 몇 년 동안 Amazon SWF에서 상당한 작업을 수행했지만 다음과 같은 점은 여전히 불분명하며 어떤 포럼에서도 정답을 찾을 수 없습니다.Amazon SWF 쿼리
이것은 내가 생각하기에 꽤 기본적인 요구 사항이며, 다른 사람들도 역시 눈에 might 수도 있습니다. 누군가가 이것을 분명히 할 수 있다면 좋을 것입니다.
- 워크 플로 실행 결과 (어쩌면 단지 부울처럼 단순한 무언가)를 워크 플로 스타터로 되돌릴 수있는 간단한 방법이 있습니까?
- Activity timeout 예외를 catch 할 수있는 방법이 있습니까? 그러면 그러한 시나리오에서 사용자 지정 작업을 실행할 수 있습니까?
- 왜 WorkflowExecutionHistory에 활동이 들어 있지 않은 이유는 무엇입니까?
- 워크 플로가 실패한 지점에서 워크 플로를 다시 시작하는 간단한 방법이없는 이유는 무엇입니까?
내 직장에서 더 많은 비즈니스 프로세스를 위해 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);
}
}
감사합니다. Maxim. 1. 좀 더 자세히 설명해 주시겠습니까? 제안 된 접근법의 예가 있습니까? 2. 예, 이미 Flow를 사용하고 있습니다. Workflow timeout exception을 잡을 수 없었기 때문에, 나는 activity timeout이 작동하지 않을 것이라고 생각했다. 3. 돌아온 역사 이벤트 목록을 보면 상태가있는 활동으로 변환하는 간단한 방법을 생각할 수 없었습니다. 제안 된 접근법의 예가 있습니까? 4. 가지고 있으면 정말 유용했을 것이지만 지금은 적어도 내 자신의 방식으로 처리 할 수 있다고 생각합니다. – Rana
더 많은 정보로 답변을 업데이트했습니다. –
좋아, 조금 복잡해 보이지만 제안을 구현하려고합니다. 확실하지 않은 몇 가지 사항 ...... 주어진 결과 ActivityTaskList, 워크 플로가 활동 클래스를 유지하는 방법은 무엇입니까? 워크 플로 스타터에서 Future 개체가 언제 준비되는지 알 수있는 방법은 무엇입니까? while (! future.isDone()) {Thread.sleep (10);} 그렇다면이 방법이 가장 효과적입니까? – Rana