似乎根据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
对象。我非常感谢澄清。
谢谢。
答案 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();