0

並行して実行する必要がある 2 つのアクティビティ セットがあります。正常に完了した後、別の一連のアクティビティを実行したいと考えています。タスクを使用しましたが、機能していました。しかし、@Asynchronous アノテーションを使用した後、DecisionTaskTimedOut を取得していて、どのアクティビティも実行を開始しません。ターゲットで次のクラスを確認できるため、aspectj 構成は機能しています。

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();
            }
        };
    }
}

アスペクト織りに問題はありますか?どんな提案でも大歓迎です。

4

1 に答える 1

2

@Asynchronousメソッドは、型 Promise を拡張するすべてのパラメーターの準備が整ったときに実行されます。resパラメーターの準備ができていないため、 @Asynchronous メソッドが実行されることはありません。解決策は、 @NoWaitでそのようなパラメーターに注釈を付けて、これらを待機してはならないことをフレームワークに通知することです。

「スタック」しているように見えるワークフローをトラブルシューティングする最善の方法は、すべての未処理タスクの非同期スタック トレースを含む「非同期スタック トレース」を確認することです。このようなトレースを出力するには、 WorkflowExecutionFlowThreadDumperを使用します。

于 2014-11-04T22:42:37.777 に答える