2014-10-28 63 views
0

我有两组需要并行执行的活动。成功完成后,我想执行另一组活动。我使用任务,它正在工作。但是,在使用@Asynchronous注释之后,我得到了DecisionTaskTimedOut,并且没有任何活动开始执行。我AspectJ的配置工作,我可以在我的目标看下面的类:DecisionTaskTimedOut使用@Asynchronous注释时

AsyncWorkflowImpl $ AjcClosure1.class

AsyncWorkflowImpl $ AjcClosure3.class

AsyncWorkflowImpl $ AjcClosure5.class

异步版本

public class AsyncWorkflowImpl implements AsyncWorkflow{ 

     private AsyncActivitiesClient activitiesClient = new AsyncActivitiesClientImpl(); 
     private Async2ActivitiesClient activitiesClient2 = new Async2ActivitiesClientImpl(); 

     @Override 
     public void executeActivity() { 

      Promise<Integer> intermediateRes = null; 
      Promise<Integer> intermediateRes2 = null; 
      for(int i=0; i<5; i++){ 
       intermediateRes = testIntermediate(Promise.asPromise(i), intermediateRes); 
      } 
      for(int i=0; i<5; i++){ 
       intermediateRes2 = testIntermediate2(Promise.asPromise(i), intermediateRes2); 
      } 
      test(intermediateRes,intermediateRes2); 
     } 

     @Asynchronous 
     public Promise<Integer> testIntermediate(final Promise<Integer> i, Promise<Integer> res){ 

      return activitiesClient.testAct1(i); 
     } 

     @Asynchronous 
     public Promise<Integer> testIntermediate2(final Promise<Integer> i, Promise<Integer> res){ 
      return activitiesClient2.testAct1(i); 
     } 

     @Asynchronous 
     public void test(final Promise<Integer> res, final Promise<Integer> res2){ 

      activitiesClient.testAct2(); 
     } 

    } 

任务版本

public class AsyncWorkflowImpl implements AsyncWorkflow{ 

    private AsyncActivitiesClient activitiesClient = new AsyncActivitiesClientImpl(); 
    private Async2ActivitiesClient activitiesClient2 = new Async2ActivitiesClientImpl(); 

    @Override 
    public void executeActivity() { 

     Promise<Integer> intermediateRes = null; 
     Promise<Integer> intermediateRes2 = null; 
     Settable<Integer> finalRes = new Settable<Integer>(); 
     Settable<Integer> finalRes2 = new Settable<Integer>(); 
     for(int i=0; i<5; i++){ 
      intermediateRes = testIntermediate(i, intermediateRes); 
     } 
     for(int i=0; i<5; i++){ 
      intermediateRes2 = testIntermediate2(i, intermediateRes2); 
     } 
     finalRes.chain(intermediateRes); 
     finalRes2.chain(intermediateRes2); 
     test(finalRes,finalRes2); 
    } 

    public Promise<Integer> testIntermediate(final Integer i, Promise<Integer> res){ 
     final Settable<Integer> tempRes = new Settable<Integer>(); 
     new Task(res){ 
      @Override 
      protected void doExecute() throws Throwable { 

       tempRes.chain(activitiesClient.testAct1(i)); 
      } 
     }; 
     return tempRes; 
    } 

    public Promise<Integer> testIntermediate2(final Integer i, Promise<Integer> res){ 
     final Settable<Integer> tempRes = new Settable<Integer>(); 
     new Task(res){ 
      @Override 
      protected void doExecute() throws Throwable { 

       tempRes.chain(activitiesClient2.testAct1(i)); 
      } 
     }; 
     return tempRes; 
    } 

    public void test(final Promise<Integer> res, final Promise<Integer> res2){ 

     new Task(res, res2){ 
      @Override 
      protected void doExecute() throws Throwable { 

       activitiesClient.testAct2(); 
      } 
     }; 
    } 
} 

是否有AspectJ织什么问题?任何建议非常感谢。

回答

2

一个@Asynchronous方法执行时所有其扩展类型Promise准备就绪。您的@Asynchronous方法永远不会执行,因为参数永远不会准备好。解决方案是用@NoWait注释这些参数来通知框架不应该等待这些参数。

对出现“卡住”的工作流进行故障排除的最佳方法是查看其包含所有未完成任务的异步堆栈跟踪的“异步堆栈跟踪”。使用WorkflowExecutionFlowThreadDumper发出这样的踪迹。

+0

感谢您的回复。承诺为null尚未准备好?我想按顺序执行testIntermediate方法,并且按顺序执行testIntermedaite2方法。如果我使用@NoWait注释,那么它会等待前一个注释的完成吗? – Rahul 2014-11-06 19:06:17

+0

您可以用Promise.asPromise(0)替换null以查看它是否确实是问题。 – 2014-11-06 20:32:03