【发布时间】:2016-12-30 23:13:36
【问题描述】:
我正在尝试执行 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 被填充并由活动方法返回,然后再继续。
【问题讨论】:
-
我发现当 AspectJ 或 SWF 注释设置不正确时最常发生特定错误。那样就很烦人了……
-
您如何确定哪些注释设置不正确?我删除了项目的 AspectJ 功能,然后重新添加了它们。仍然得到同样的错误。如果我只调用一次活动方法(即在第一次调用活动方法后删除代码路径),代码就可以工作。
-
"您如何确定哪些注释设置不正确?"很多痛苦。筛选文档以检查和仔细检查。需要 AspectJ 的 SWF 使得调试它变得非常痛苦。抱歉,我帮不上什么忙。
-
使用任务而不是@Asynchronous。它看起来更丑,但不依赖 AspectJ。
标签: java amazon-web-services promise amazon-swf