【问题标题】:Returning Promise from AWS.SWF Workflow从 AWS.SWF 工作流返回 Promise
【发布时间】:2014-03-14 00:30:32
【问题描述】:

好像根据swf-docs下面的代码:

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

应该生成返回Promise&lt;String&gt;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 对象。非常感谢您的澄清。

谢谢。

【问题讨论】:

    标签: amazon-web-services amazon-swf


    【解决方案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
    

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

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

    【讨论】:

    • 您能否发布一些关于如何将其与 ExternalClient 一起使用的代码?
    猜你喜欢
    • 1970-01-01
    • 2018-11-26
    • 2021-08-14
    • 2016-12-27
    • 2019-05-28
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    相关资源
    最近更新 更多