Я пытаюсь выполнить рабочий процесс SWF. У меня возникла проблема с состоянием объекта Promise
. Моя структура кода выглядит следующим образом:
Методы в 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 будет заполнен и возвращен методом активности, прежде чем продолжить.