2012-07-04 3 views
1

У меня есть простой асинхронный метод:рекурсии с помощью AWS Simple Workflow Service

@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 
} 

Выход я получаю (я называю DoSomething с 100):

Current value: 100 

После того, выполнение рабочего процесса не удается, и дает мне ошибку заявив, что эта деятельность не найдена. Почему он не найден? Как это было найдено в первом исполнении?

ответ

3

Пара вещей:

  1. Когда вы передаете переменную обещание, вы звоните 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()?

+0

Спасибо. # 3 решил это для меня :) –

+0

Добро пожаловать! :) – instanceOfObject

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