AWS SWF Java:Activity returns 值但承诺永远不会准备就绪
AWS SWF Java: Activity returns value but promise never becomes ready
我认为有一个不寻常的问题,我正在寻求调试帮助。
问题:
即使 AWS SWF 控制台显示 activity 返回了有效响应,Flow Framework 也从未将承诺标记为就绪!例如。在下面的代码中,"activities.nextTask" 永远不会被安排执行。
唯一一次 "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 发生故障时,不会记录任何内容。
添加无参数构造函数可解决问题。
我认为有一个不寻常的问题,我正在寻求调试帮助。
问题:
即使 AWS SWF 控制台显示 activity 返回了有效响应,Flow Framework 也从未将承诺标记为就绪!例如。在下面的代码中,"activities.nextTask" 永远不会被安排执行。
唯一一次 "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 发生故障时,不会记录任何内容。
添加无参数构造函数可解决问题。