2017-01-11 2 views
2

За последние пару лет я проделал большую работу над Amazon SWF, но следующие моменты пока не ясны, и я не могу найти прямых ответов на любые форумы.Amazon SWF queries

Это довольно простые требования, я полагаю, наверняка другие могли столкнуться. Было бы здорово, если бы кто-то мог это прояснить.

  1. Есть ли простой способ вернуть результат выполнения рабочего процесса (может быть, просто что-то такое же простое, как и логическое), обратно к началу рабочего процесса?
  2. Есть ли способ уловить исключение тайм-аута активности, чтобы мы могли запускать настраиваемые действия в таких сценариях?
  3. Почему WorkflowExecutionHistory не содержит действия, почему только события?
  4. Почему нет простого способа перезапуска рабочего процесса с момента его отказа?

Я рассматриваю возможность использования 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); 
    } 
} 

ответ

2
  1. Стандартный шаблон должен провести особую активность в процессе стартового рабочего процесса, который используется для доставки результата. Используйте список задач, относящихся к конкретному процессу, чтобы убедиться, что он перенаправлен на правильный экземпляр стартера. Ниже приведены шаги по его реализации:

    • Определите действие для получения результата. Например, "returnResultActivity". Внесите эту реализацию реализации, чтобы завершить Будущее, переданное его конструктору после выполнения.
    • Когда рабочий процесс запущен, он получает «resultActivityTaskList» в качестве входного аргумента. В конце рабочий процесс вызывает это действие с результатом рабочего процесса. Активность запланирована в списке пройденных задач.
    • Стартер рабочего процесса создает ActivityWorker и экземпляр Будущего. Затем он создает экземпляр «returnResultActivity» с этим будущим в качестве параметра конструктора.
    • Затем он регистрирует экземпляр действия с рабочим работником и настраивает его для опроса по произвольно сгенерированному имени списка задач. Затем он вызывает «запуск выполнения рабочего процесса», передавая сгенерированное имя списка задач в качестве входного аргумента.
    • Затем он ждет от Будущего. Функция future.get() вернет результат рабочего процесса.
  2. Да, если вы используете инфраструктуру потока AWS, время ожидания тайм-аута выбрасывается при истечении времени активности. Если вы не используете структуру потока, чем вы делаете свою жизнь в 100 раз сложнее. BTW тайм-аут рабочего процесса также переносится в родительский рабочий процесс как исключение таймаута. Исключить исключение тайм-аута рабочего процесса невозможно из самого экземпляра тайм-аута. В этом случае рекомендуется не полагаться на тайм-аут рабочего процесса, а просто создавать таймер, который будет запускать и уведомлять логику рабочего процесса о том, что какое-то событие в бизнесе было отключено.

  3. Поскольку одно действие имеет несколько событий, связанных с ним. Должно быть довольно легко написать код, который преобразует историю в любое представление о действиях, которые вам нравятся.Такой код будет соответствовать событиям, связанным с каждым видом деятельности. Каждое событие всегда ссылается на связанные события, поэтому их легко сводить к представлению более высокого уровня.

  4. К сожалению, на этот вопрос нелегко ответить. В идеале SWF будет поддерживать перезапуск рабочего процесса, скопировав его историю до точки отказа. Но он не поддерживается. Я лично считаю, что рабочий процесс должен быть написан так, чтобы он никогда не терпел неудачу, но всегда справляется с ошибками без сбоев. Очевидно, что это не работает в случае сбоев из-за неожиданных условий. В этом случае простой процесс записи рабочего процесса таким образом, что его можно перезапустить с самого начала.

+0

Спасибо, Максимум. 1. Не могли бы вы рассказать немного больше? Есть ли какой-нибудь пример вашего предложенного подхода? 2. Да, я уже использую Flow. Поскольку я не смог уловить исключение тайм-аута Workflow, я предположил, что тайм-аут активности также не будет работать, но даст ему преимущество. 3. Посмотрев на список событий истории, которые я получил, я не мог подумать о простом способе преобразования их в действия со статусом. Есть ли какой-нибудь пример вашего предложенного подхода? 4. Было бы действительно полезно иметь его, но я предполагаю, что смогу справиться с этим по-своему, по крайней мере, пока. – Rana

+0

Я обновил ответ с дополнительной информацией. –

+0

Хорошо, звучит немного сложно, но пытается реализовать ваше предложение. Пара вещей, о которых я не уверен ... Учитывая результатActivityTaskList, как бы рабочий процесс справился с классом активности? И в стартере рабочего процесса, как бы узнать, когда объект Future готов. Должен ли я делать что-то наподобие while (! Future.isDone()) {Thread.sleep (10);} Если да, это лучший и самый эффективный способ? – Rana

Смежные вопросы