1

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

@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

之后,工作流执行失败并给我一个错误,指出找不到活动。为什么没有找到?第一次处决时是如何发现的?

4

2 回答 2

3

几件事:

  1. 当你传递一个 promise 变量时,你调用variable.get()它来提取它的值。

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

  3. 代码应该是这样的(使用Promise.asPromise()and 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() 的类的客户端实现吗?

于 2012-07-15T07:10:16.187 回答
1

上面的代码能编译吗?

Promise<int>应该Promise<Integer>并且something--会给出编译错误,你不能从转换Promise<Integer>int.

无论如何,使用递归来实现并行活动执行看起来并不正确。您可以在这里轻松地使用 for 循环 -

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);
于 2012-07-11T19:24:29.810 回答