Возврат Promise из рабочего процесса AWS.SWF

Похоже, что в соответствии с swf-docs следующий код:

@Workflow
@WorkflowRegistrationOptions(
   defaultExecutionStartToCloseTimeoutSeconds = 60,
   defaultTaskStartToCloseTimeoutSeconds = 10)
public interface MyWorkflow
{
    @Execute(version = "1.0")
    Promise<String> startMyWF(int a, String b);
}    

Должен генерировать MyWorkflowClientExternal, который возвращает Promise<String>; то есть:

Promise<String> startMyWF(int a, String b);

Однако вместо этого для MyWorkflowClientExternal и MyWorkflowClientExternalImpl создается метод void:

void startMyWF(int a, String b) ...

Внутренний клиент MyWorkflowClient и MyWorkflowClientImpl действительно возвращает объект Promise, как и ожидалось:

Promise<String> startMyWF(int a, String b);

Я хотел бы использовать ExternalClient; но, похоже, он не возвращает объект Promise. Буду очень признателен за разъяснения.

Спасибо.


person Neil    schedule 14.03.2014    source источник


Ответы (1)


Я разместил этот вопрос на форуме разработчиков AWS-SWF; и @maxim-fateev любезно указал несколько подходов:

Возвращаемое значение рабочего процесса очень полезно для дочерних рабочих процессов, поскольку они моделируются как асинхронные вызовы. Для автономных рабочих процессов вы можете использовать один из следующих вариантов для получения результатов:

1) Получить его из истории рабочего процесса с помощью SWF API GetWorkflowExecutionHistory (результат — в событии WorkflowExecutionCompleted). Вы также можете просмотреть историю с помощью консоли SWF.

2) Разработайте свой рабочий процесс, чтобы куда-то поместить результат, например, вы можете добавить действие в конце, чтобы поместить результат в хранилище, и приложение будет периодически просматривать его.

3) Разместите активность в программе, которая запускает выполнение рабочего процесса. Стартовая программа рабочего процесса теперь становится частью рабочего процесса, и действие, которое она размещает, может быть передано как результат рабочего процесса.

Вы можете использовать первый вариант в ручных инструментах. Тем не менее, это не рекомендуется в качестве общего механизма для получения приложениями результатов рабочего процесса, поскольку он фактически требует от вас опроса SWF для проверки завершения рабочего процесса и противоречит нашей схеме длительного опроса.

Я пошел с подходом № 2; вот суть этого (если вы думаете, что есть лучший способ, пожалуйста, дайте мне знать).

Создано NotificationActivityImpl:

public class NotificationActivitiesImpl implements NotificationActivities {

    private Object notification;

    public NotificationActivitiesImpl() {
        this.notification = null;
    }

    @Override
    public void notify(Object obj) {
        this.notification = obj;
    }

    /**
     * @return notification (will block until it is available)
     */
    @Override
    public Object getNotification() {
        while (notification == null ){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return notification;
    }
}

В WorkflowImpl добавлено:

notificationClient.notify(obj) // obj that want to pass back to your app

В приложении (которое запускает рабочий процесс и NotificationAcitivityWorker) добавлено следующее:

workflowWorker.start();
notificationWorker.start();
NotificationActivitiesImpl notificationImpl = (NotificationActivitiesImpl) notificationWorker.getActivitiesImplementations().iterator().next();
Object notification = notificationImpl.getNotification();
person Neil    schedule 17.03.2014
comment
Не могли бы вы опубликовать код о том, как использовать это с ExternalClient? - person Ashwini Shahapurkar; 24.04.2014