簡體   English   中英

從AWS.SWF工作流程返回承諾

[英]Returning Promise from AWS.SWF Workflow

根據swf-docs ,似乎出現以下代碼:

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

應該生成返回Promise<String> MyWorkflowClientExternal ; 即:

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

但是,將為MyWorkflowClientExternalMyWorkflowClientExternalImpl生成一個void方法:

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

內部客戶端MyWorkflowClientMyWorkflowClientImpl確實按預期返回Promise對象:

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

我想使用ExternalClient ; 但它似乎沒有返回Promise對象。 我非常感謝您的澄清。

謝謝。

我在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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM