SWF 워크 플로를 실행하려고합니다. Promise
개체 상태와 관련된 문제가 있습니다. 내 코드 strucutre은 다음과 같습니다 : WorkflowClientImpl.java에서AWS SWF Promise IllegalStateException : 준비되지 않음
방법 :
@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
}
위의 코드는 특정 조건이 충족 될 때 워크 플로우를 다시 시작하기로되어있다. 조건은 Activity 메소드가 반환 한 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가 채워지고 진행하기 전에 activity 메소드에 의해 반환 될 때까지 기다려야합니다.
AspectJ 또는 SWF 주석이 제대로 설정되지 않은 경우 특정 오류가 가장 자주 발생합니다. 그런 식으로 꽤 귀찮습니다. – Krease
어떤 주석이 올바르게 설정되지 않았는지 어떻게 확인 했습니까? 프로젝트의 AspectJ 기능을 제거한 다음 다시 추가했다. 여전히 같은 오류가 발생합니다. 액티비티 메소드를 한 번만 호출하면 (즉, 액티비티 메소드를 처음 호출 한 후 코드 경로를 제거하면) 코드가 작동합니다. – learningMyWayThru
"어떤 주석이 올바르게 설정되지 않았는지 어떻게 확인 했습니까?" 고통 많이. 확인하고 다시 확인하기 위해 문서를 선별. AspectJ를 요구하는 SWF는 디버깅을 매우 어렵게 만든다. 미안하지만 나는 더 많은 것을 도울 수 없다. – Krease