使用AWS Simple Workflow Service进行递归

时间:2012-07-04 20:03:07

标签: amazon-swf

我有一个简单的异步方法:

@Asynchronous
public void doSomething(Promise<int> something) {
    if(something == 0) {
        return;
    }

    ActivityHolder.someActivity();
    System.out.println("Current value: " + Integer.toString(something));
    doSomething(something--);
}

这就是我正在做的事情,看看我的某个要求是否可行。基本上,我希望批量执行某些操作,每个批次的成员并行运行。我基本上有另一个活动(在另一个班级):

@Activity
public void someActivity() {
    // Some stuff
}

我得到的输出是(我用100调用doSomething):

Current value: 100

之后,工作流程执行失败,并向我显示错误,指出未找到活动。为什么没找到?它是如何在第一次执行中找到的?

2 个答案:

答案 0 :(得分:3)

一些事情:

  1. 传递promise变量时,请在其上调用variable.get()以提取其值。

  2. 如果您未找到活动错误,是否检查此活动是否实际已注册?首先运行您的活动类,看看它们是否从日志中运行。确保您已成功注册活动。

  3. 代码应该是这样的(使用Promise.asPromise()promise.get()):

    @Asynchronous
    public void doSomething(Promise<int> something) {
        if(something.get() == 0) {
            return;
        }
    
        ActivityHolder.someActivity();
        System.out.println("Current value: " + Integer.toString(something.get()));
        doSomething(Promise.asPromise(something.get()--));
    }
    
  4. 这里的ActivityHolder是什么?它是包含someActivity()的类的客户端实现吗?

答案 1 :(得分:1)

以上代码是否编译?

Promise<int>应为Promise<Integer>something--会出现编译错误,您无法从Promise<Integer>转换为int

无论如何,使用递归来实现并行活动执行看起来并不合适。你可以在这里轻松使用循环 -

List<Promise<Void>> promiseList = new ArrayList<Promise<Void>>();
for (int i=0; i<100; i++) {
    Promise<Void> promise = ActivityHolder.someActivity();
    promiseList.add(promise);
}

callSomeOtherAsynchronousMethod(arg1, arg2, promiseList);