【问题标题】:AWS SWF Java: Activity returns value but promise never becomes readyAWS SWF Java:活动返回值,但承诺永远不会准备好
【发布时间】:2015-09-21 05:43:22
【问题描述】:

我认为我遇到了一个不寻常的问题,我正在寻求调试帮助。

问题:

  1. 尽管 AWS SWF 控制台显示活动返回了有效响应,但 Flow Framework 永远不会将承诺标记为就绪!例如。在下面的代码中,“activities.nextTask”从未计划执行。

  2. “activities.nextTask”计划执行的唯一时间是如果结果是一个空列表!

工作流程代码:

@Override
public void myworkflow() {
    Promise<List<ValidationError>> result = activities.validate(input);
    handleValidationResult(result);

    Promise<Void> nextResult = activities.nextTask(input, result);
}

@Asynchronous
public void handleValidationResult(Promise<List<ValidationError>> result) {
   System.out.println("WHY ISN'T THIS BEING EXECUTED?");
}

ValidationError 看起来像这样(使用 lombok):

@Value
public class ValidationError {
    String message;
    boolean isRetryable;
}

【问题讨论】:

  • 值得注意的是,我验证了两个具有相同值的 ValidationError 实例相等(使用 .equals())。另外值得注意的是,具有相同值的两个 ValidationError 列表是相等的。我检查了这一点,以防 Flow 重播依赖于结果的相等性来保持一致。就我而言,它们是一致的。
  • 代码看起来没问题,但可能是活动完成后工作流任务从未执行。确保在报告活动完成后启动工作流任务。如果它已启动但未能产生正确的结果,我建议使用 docs.aws.amazon.com/amazonswf/latest/awsflowguide/… 中描述的 WorkflowReplayer 在调试器中运行您的代码。
  • 工作流任务在活动完成后调度并执行。我发现了问题并发布了答案。 Jackson 需要一个无参数构造函数,而我没有给它一个 :)

标签: java amazon-web-services amazon-swf


【解决方案1】:

ValidationError 缺少默认构造函数(即无参数构造函数)。

将代码更改为:

@Data
@NoArgsConstructor
public class ValidationError {
    ...
}

工作流和活动之间的对象传递需要序列化和反序列化。因此,SWF 需要一个 DataConverter 来执行此操作。默认的 DataConverter 是由 Jackon 支持的 JsonDataConverter。 Jackson 默认需要无参数构造函数,但 Lombok 的 @Value 不提供无参数构造函数。因此杰克逊无法反序列化活动的结果。这解释了为什么空列表按预期工作,但 ValidationError 的非空列表没有按预期工作。

事实证明,SWF 中的 JsonDataConverter 在遇到此问题时会引发 DataConverterException,但在 SWF 内部的某个地方正在吞噬该异常。调试很困难,因为当 JsonDataConverter 发生故障时,不会记录任何内容。

添加无参数构造函数可以解决问题。

【讨论】:

    猜你喜欢
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 2016-05-06
    • 2019-11-29
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多