За последние пару лет я проделал большую работу над Amazon SWF, но следующие моменты пока не ясны, и я не могу найти прямых ответов на любые форумы.Amazon SWF queries
Это довольно простые требования, я полагаю, наверняка другие могли столкнуться. Было бы здорово, если бы кто-то мог это прояснить.
- Есть ли простой способ вернуть результат выполнения рабочего процесса (может быть, просто что-то такое же простое, как и логическое), обратно к началу рабочего процесса?
- Есть ли способ уловить исключение тайм-аута активности, чтобы мы могли запускать настраиваемые действия в таких сценариях?
- Почему WorkflowExecutionHistory не содержит действия, почему только события?
- Почему нет простого способа перезапуска рабочего процесса с момента его отказа?
Я рассматриваю возможность использования SWF для большего количества бизнес-процессов на своем рабочем месте, но эти ограничения/сомнения удерживают меня!
ЗАВЕРШЕНИЕ рабочий раствор
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);
}
}
Спасибо, Максимум. 1. Не могли бы вы рассказать немного больше? Есть ли какой-нибудь пример вашего предложенного подхода? 2. Да, я уже использую Flow. Поскольку я не смог уловить исключение тайм-аута Workflow, я предположил, что тайм-аут активности также не будет работать, но даст ему преимущество. 3. Посмотрев на список событий истории, которые я получил, я не мог подумать о простом способе преобразования их в действия со статусом. Есть ли какой-нибудь пример вашего предложенного подхода? 4. Было бы действительно полезно иметь его, но я предполагаю, что смогу справиться с этим по-своему, по крайней мере, пока. – Rana
Я обновил ответ с дополнительной информацией. –
Хорошо, звучит немного сложно, но пытается реализовать ваше предложение. Пара вещей, о которых я не уверен ... Учитывая результатActivityTaskList, как бы рабочий процесс справился с классом активности? И в стартере рабочего процесса, как бы узнать, когда объект Future готов. Должен ли я делать что-то наподобие while (! Future.isDone()) {Thread.sleep (10);} Если да, это лучший и самый эффективный способ? – Rana