0

似乎根据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>; IE:

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

但是,会为MyWorkflowClientExternal和生成一个 void 方法MyWorkflowClientExternalImpl

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

内部客户端MyWorkflowClient并按MyWorkflowClientImpl预期返回 Promise 对象:

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

我想用ExternalClient;但它似乎没有返回Promise对象。我非常感谢您的澄清。

谢谢你。

4

1 回答 1

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();
于 2014-03-17T07:53:35.423 回答