У меня есть два сервера (экземпляры EC2). На одном сервере (сервер 1) у меня 5 пакетов, а на другом (сервер 2) у меня 6 пакетов. Я завернул каждую партию в действия и класс реализации рабочего потока приведен ниже. Я хочу перебирать действия (целые действия, включая сервер 1 и 2), исходя из дат исполнения. Например, если дата меньше текущей даты, выполните все действия обоих серверов 1 и 2, начиная с указанной даты до текущей даты. Если дата исполнения равна текущей дате, выполните все действия как сервера 1, так и 2 для текущей даты. Кроме того, если какое-либо действие за день выдает какое-либо исключение, не выполняйте действия на следующий день (< = текущая дата).Итерации над списком действий на основе ввода, предоставленного с использованием AWS SWF
public class JobWorkflowImpl implements JobWorkflow{
private DecisionContextProvider contextProvider
= new DecisionContextProviderImpl();
private WorkflowClock clock
= contextProvider.getDecisionContext().getWorkflowClock();
private BS1JobActivitiesClient bs1ActivitiesClient
= new BS1JobActivitiesClientImpl();
private BS2JobActivitiesClient bs2ActivitiesClient
= new BS2JobActivitiesClientImpl();
@Override
public void executeJob(Date exedate) {
Date today = new Date(clock.currentTimeMillis());
Date toProcess = exedate;
// All date manipulations are pseudocode here as I'm lazy
// to look up the real ones.
Promise<Void> previousDateDone = null;
while(toProcess <= today) {
// Create chain of executeJobForExactDate
// linked by previousDateDone to ensure that they are executed sequentially.
// null Promise is treated as ready promise by the framework.
previousDateDone = executeJobForExactDate(toProcess, previousDateDone);
toProcess.addDay(1);
}
}
Promise<Void> void executeJobForExactDate(Date date, Promise<Void> previous) {
Settable<Integer> firstServerDone = new Settable<Integer>();
Settable<Integer> secondServerDone = new Settable<Integer>();
Settable<Integer> resultODLSLBs1 = new Settable<Integer>();
//TODO Iterate over the activities
new TryCatchFinally(previous){
@Override
protected void doTry(){
Promise<Integer> resultFARBs1 = bs1ActivitiesClient.executecommand1(date);
Promise<Integer> resultUAMLFBs1 = bs1ActivitiesClient.executecommand2(date, resultFARBs1);
Promise<Integer> resultLLPBs1 = bs1ActivitiesClient.executecommand3(date, resultUAMLFBs1);
Promise<Integer> resultODLDLBs1 = bs1ActivitiesClient.executecommand4(date, resultLLPBs1);
// Chain links result of the activity execution
// to an aready existing Settable.
resultODLSLBs1.chain(bs1ActivitiesClient.executecommand5(date, resultODLDLBs1));
}
@Override
protected void doCatch(Throwable e){
throw new MyException("Failed");
}
@Override
protected void doFinally() throws Throwable {
firstServerDone.set(null);
}
};
new TryCatchFinally(previous){
@Override
protected void doTry() {
Promise<Integer> resultFARBs2 = bs2ActivitiesClient.executecommand1(date);
Promise<Integer> resultUAMLFBs2 = bs2ActivitiesClient.executecommand2(date, resultFARBs2);
Promise<Integer> resultLLPBs2 = bs2ActivitiesClient.executecommand3(date, resultUAMLFBs2);
Promise<Integer> resultODLDLBs2 = bs2ActivitiesClient.executecommand4(date, resultLLPBs2);
Promise<Integer> resultODLSLBs2 = bs2ActivitiesClient.executecommand5(date, resultODLDLBs2, resultODLSLBs1);
bs2ActivitiesClient.executecommand6(date, resultODLSLBs2);
}
@Override
protected void doCatch(Throwable e){
throw new MyException("Failed");
}
@Override
protected void doFinally(){
secondServerDone.set(null);
}
};
// AndPromise is done when all of its constructor parameters are done.
// I decided to consider the date processing done when both
// TryCatchFinallies are done. You can implement more complex logic depending on
// the business requirements. One option is to wrap both TryCatcFinallies
// in another TryCatchFinally.
return new AndPromise(firstServerDone, secondServerDone);
}
}
Проблема заключается в том, что, если какая-либо активность сервера 1 выбрасывает любое исключение, то, оно отменяя всю деятельность, которая не запускается как для сервера 1 и сервера 2. Но я хочу только деятельность, которые имеют не выполняемый на сервере, должен быть отменен по мере сбоя его активности на сервере, другой сервер должен как можно дальше продолжить (т. е. место, до которого оно зависит).
Нет, его не работает. Все команды не выполняются последовательно, т. Е. Весь набор не выполняется последовательно. Вывод выглядит так: Server1 cmd1 Server1 cmd1 Server1 cmd2 Server1 cmd2 ... То же самое с сервером 2 Выход должен быть: Server1 cmd1 Server1 cmd2 Server1 cmd1 Server1 cmd2 – Rahul
Вы печатаете вывод из реализации активности? Печать из реализации рабочего процесса не рекомендуется, так как состояние рабочего процесса восстанавливается с использованием повтора, и один и тот же код выполняется несколько раз. –
Я напечатал его из класса реализации активности, то есть из класса BS1JobActivitiesClientImpl и класса BS2JobActivitiesClientImpl. – Rahul