2012-06-08 2 views
1

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

Из того, что я читал о дешифраторах, решатели могут выбрать один из многих возможных вариантов для следующего этапа.

Но я хочу перейти на следующий этап, только когда все параллельные процессы текущего этапа завершены.

Означает ли это, что я должен настроить каждый параллельный процесс для вызова следующего этапа, и когда следующий этап инициализируется, он должен проверить, завершены ли все параллельные процессы предыдущего этапа и только тогда на самом деле начать обработку? Это будет означать, что все параллельные процессы первой ступени будут ссылаться на коррекцию. параллельные процессы второй ступени, из которых только один будет фактически обрабатывать (так как это будет процесс, который обнаружит, что все процессы предыдущего этапа завершены).

Есть ли лучший способ реализации этого? Так что процесс следующего этапа называется только один раз?

+0

Как правило, компоненты системы или трубопровода, как вы описываете, должны быть как можно более развязаны. Это упрощает изменение или замену конкретного компонента. При вызове одного процесса следующее не очень развязано. Вы можете использовать посредника, например, очередь (или даже таблицу базы данных или файл) в качестве механизма передачи сообщений, который уведомляет следующий компонент, который он должен выполнить. Дьявол в деталях, и я замалчиваю детали, но это общая стратегия, которую нужно почти всегда рассматривать. Абстракция и развязка - ваши друзья. –

ответ

5

Это можно решить, используя объекты Promise, возвращаемые действиями в flow framework.

В вашем коде принятия решения есть функция для stage1, которая будет выполнять несколько действий параллельно, каждый из которых возвращает объект Promise. Добавьте все эти объекты обещания в List<Promise<>> и передайте этот список асинхронному методу, который обрабатывает этап 2.

Вот пример кода. stage1() выполняет три действия параллельно и вызывает асинхронный метод stage2(@Wait List<Promise<Void>> promiseList). stage2 не будет запущен, если все обещания в promList не будут удовлетворены, т. е. если все три действия на этапе 1 не будут завершены.

private void stage1() { 
    List<Promise<Void>> promiseList = new ArrayList<Promise<Void>>(); 
    Promise<Void> promise1 = activityClient.activity1(); 
    Promise<Void> promise2 = activityClient.activity2(); 
    Promise<Void> promise3 = activityClient.activity3(); 

    promiseList.add(promise1); 
    promiseList.add(promise2); 
    promiseList.add(promise3); 

    stage2(promiseList); 
} 

@Asynchronous 
private void stage2(@Wait List<Promise<Void>> promiseList) { 
    activityClient.activity4(); 
}