AWS SWF Java:活动返回值但承诺永远不会准备就绪

时间:2015-09-21 05:43:23

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

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

问题:

  1. 即使AWS SWF控制台显示活动返回了有效响应,Flow Framework也从未将承诺标记为准备就绪!例如。在下面的代码" activities.nextTask"永远不会安排执行。

  2. 唯一的时间" activities.nextTask"如果结果是空列表,则计划执行!

  3. 工作流程代码:

    @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;
    }
    

1 个答案:

答案 0 :(得分:1)

ValidationError缺少默认构造函数(即no-args构造函数)。

将代码更改为:

void

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

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

添加no-arg构造函数可以解决问题。