我认为我有一个不寻常的问题,而且我正在寻找调试帮助。
问题:
即使AWS SWF控制台显示活动返回了有效响应,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;
}
答案 0 :(得分:1)
ValidationError缺少默认构造函数(即no-args构造函数)。
将代码更改为:
void
需要对工作流和活动之间的对象进行序列化和反序列化。因此,SWF需要DataConverter才能执行此操作。默认的DataConverter是Jackon支持的JsonDataConverter。默认情况下,Jackson需要一个无参数构造函数,但Lombok的@Value不提供no-args构造函数。因此,杰克逊无法将活动的结果反序列化。这解释了为什么空列表按预期工作,但是非空的ValidationError列表没有按预期工作。
事实证明,SWF中的JsonDataConverter在遇到此问题时会抛出DataConverterException,但在SWF内部的某个地方会吞下异常。调试很困难,因为当JsonDataConverter发生故障时,不会记录任何内容。
添加no-arg构造函数可以解决问题。