我試圖執行SWF工作流程。我遇到了關於Promise
對象狀態的問題。我的代碼strucutre是如下:AWS SWF Promise IllegalStateException:未準備好
方法在WorkflowClientImpl.java:
@Override
public void doSomething() {
new TryCatch() {
@Override
protected void doTry() throws Throwable {
System.out.println("Workflow Started");
Promise<SomeObject> someObject = activityClient.doAction(param1);
if(someObject.isready()) {
boolean reDo = shouldRestartWorkflow(someObject);
if(reDo) {
Promise<Void> timer = decisionContextProvider.getDecisionContext().getWorkflowClock()
.createTimer(TimeUnit.MINUTES.toSeconds(5));
continueAsNew(timer, param1);
}
}
}
@Override
protected void doCatch(Throwable e) throws Throwable {
System.err.printlnt("Error occured while workflow");
throw new RuntimeException(e);
}
};
}
@Asynchronous
private boolean shouldRestartWorkflow(@Wait Promise<SomeObject> someObject) {
if(someObject.get().getVariable() > 1)
return true;
return false;
}
@Asynchronous
public void continueAsNew(Promise<Void> timer, String param1) {
selfClient.execute(param1);
// SelfClient is instance of TempWorkflowSelfClient
}
上面的代碼應該是在滿足一定條件下重新啓動工作流程。條件取決於由活動方法返回的SomeObject實例中填充的值。但代碼shouldRestartWorkflow
從未出現被調用。
我試着爲此寫一個單元測試。以下是代碼:
@Before
public void setUp() throws Exception {
trace = new ArrayList<String>();
// Register activity implementation to be used during test run
TempActivitiesImpl activitiesImpl = new TempActivitiesImpl(null, null) {
@Override
public SomeObject doAction(String randomString) {
trace.add("Test Case - " + randomString);
SomeObject testObject = new SomeObject();
testObject.setVariable(true);
return testObject;
}
};
workflowTest.addActivitiesImplementation(activityImpl); //Instance to activity class
workflowTest.addWorkflowImplementationType(WorkflowImpl.class);
}
@Test
public void testWorkflowExecutionCall() throws Throwable {
WorkflowClient workflow = workflowFactory.getClient("RandomString");
Promise<Void> promise = workflow.execute("RandomString");
List<String> expected = new ArrayList<String>();
expected.add("Test Case - RandomString");
AsyncAssert.assertEqualsWaitFor("Unexpected Result", expected, trace, promise);
}
上述測試案例工作。但是,如果我要刪除if(someObject.isready())
條件。我收到錯誤IllegalStateException: Not Ready
。我能夠確定當它嘗試執行shouldRestartWorkflow()
調用時發生的錯誤。
我做錯了什麼?據我所知,在繼續之前,shouldRestartWorkflow()
應該等到SomeObject被填充並通過活動方法返回。
當AspectJ或SWF註釋設置不正確時,我發現特別的錯誤經常發生。這是非常煩人的... – Krease
你是如何確定哪些註釋設置不正確的?我刪除了項目的AspectJ功能,然後重新添加它們。仍然有相同的錯誤。如果我只調用activity方法一次(即在第一次調用activity方法後刪除代碼路徑),代碼就可以工作。 – learningMyWayThru
「您是如何確定哪些註釋未正確設置的?」很多痛苦。篩選文檔以檢查並仔細檢查。 SWF需要AspectJ使調試成爲一個巨大的痛苦。對不起,我幫不了多。 – Krease