AWS SWF Java:Activity returns 值但承诺永远不会准备就绪

AWS SWF Java: Activity returns value but promise never becomes ready

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

问题:

  1. 即使 AWS SWF 控制台显示 activity 返回了有效响应,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 缺少默认构造函数(即无参数构造函数)。

代码更改为:

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

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

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

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