Iterate over the list of activities based on the input provided using AWS SWF

家住魔仙堡 提交于 2019-12-02 11:51:39

The tricky part is that the Flow Framework requires that you use the Clock that it provides through the decision context. Otherwise it is not going to function correctly. The rest is just asynchronous Java programming.

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){
                System.out.println("Failed to execute BS1 daily job");
            }

            @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){
                System.out.println("Failed to execute BS2 daily job");
            }

            @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);
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!