2015-09-21 72 views
0

我有一個不尋常的問題,我想,我正在尋找調試幫助。AWS SWF Java:活動返回值但承諾永遠不會準備好

問題:

  1. 儘管AWS SWF控制檯顯示的活動返回有效響應,流程框架從未標誌着有望成爲準備好了!例如。在下面的代碼中,「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看起來像這樣(與龍目島):

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

值得注意的是,我驗證了具有相同值的兩個ValidationError實例是相等的(使用.equals())。另外值得注意的是,具有相同值的兩個ValidationError列表相同。我檢查了這種情況,Flow重播依賴於結果的平等性是一致的。在我的情況下,他們是一致的。 – Chaos

+0

代碼看起來不錯,但可能是活動完成後永遠不會執行工作流任務。確保在報告活動完成後啓動工作流程任務。如果它已啓動,但無法產生正確的結果,我建議使用http://docs.aws.amazon.com/amazonswf/latest/awsflowguide/troubleshooting.html中所述的WorkflowReplayer在調試器中運行代碼。 –

+0

工作流程任務在活動完成後安排並執行。我找出了問題併發布了答案。傑克遜需要一個沒有參數的構造函數,我沒有給它一個:) – Chaos

回答

1

ValidationError缺少默認構造函數(即無參數的構造函數)。

改變的代碼是:

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

工作流和活動對象之間的通過需要序列化和反序列化。因此SWF需要DataConverter來執行此操作。默認的DataConverter是由Jackon支撐的JsonDataConverter。 Jackson默認情況下需要一個無參數構造函數,但Lombok的@Value不提供無參數構造函數。因此,傑克遜無法對活動的結果進行反序列化。這解釋了爲什麼空列表按預期工作,但非空列表的ValidationError未按預期工作。

事實證明,SWF中的JsonDataConverter在遇到此問題時會拋出DataConverterException,但在SWF內部的某處正在吞噬異常。調試很困難,因爲當JsonDataConverter發生故障時,沒有任何記錄。

添加無參數構造函數可解決此問題。