从AWS.SWF工作流返回承诺

时间:2014-03-14 00:30:32

标签: amazon-web-services amazon-swf

似乎根据swf-docs以下代码:

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

应生成返回MyWorkflowClientExternal的{​​{1}};即:

Promise<String>

但是,为Promise<String> startMyWF(int a, String b); MyWorkflowClientExternal生成了void方法:

MyWorkflowClientExternalImpl

内部客户端void startMyWF(int a, String b) ... MyWorkflowClient确实按预期返回Promise对象:

MyWorkflowClientImpl

我想使用Promise<String> startMyWF(int a, String b); ;但它似乎没有返回ExternalClient对象。我非常感谢澄清。

谢谢。

1 个答案:

答案 0 :(得分:1)

我在AWS-SWF开发人员论坛上发布了此question;和@ 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

在App(启动工作流程;和NotificationAcitivityWorker)中添加以下内容:

workflowWorker.start();
notificationWorker.start();
NotificationActivitiesImpl notificationImpl = (NotificationActivitiesImpl) notificationWorker.getActivitiesImplementations().iterator().next();
Object notification = notificationImpl.getNotification();