java - AWS SWF Promise IllegalStateException: Not ready -
i trying execute swf workflow. running issue regarding state of promise
object. code strucutre below:
methods in 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 instance of tempworkflowselfclient }
the above code supposed restart workflow when conditions met. conditions dependent upon values populated in instance of someobject returned activity method. code shouldrestartworkflow
never appears invoked.
i tried write unit test this. below code:
@before public void setup() throws exception { trace = new arraylist<string>(); // register activity implementation 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 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); }
the above test case works. if remove if(someobject.isready())
condition. error illegalstateexception: not ready
. able determine error occurs when tries execute shouldrestartworkflow()
call.
am doing wrong? far understand, shouldrestartworkflow()
should wait till someobject populated , returned activity method before proceeding.
the swf annotations not set properly. due issues @asynchronous not working properly.
to add aspectj java agent
- to open preferences dialog box, click window > preferences.
- navigate java > installed jres.
- select appropriate jre , click edit.
- in default vm arguments box, enter path installed aspectj binary. path such /home/user/aspectj1.7/lib/aspectjweaver.jar, depending on operating system , on version of aspectj downloaded.
on linux, os x, or unix use:
-javaagent:/your_path/aspectj/lib/aspectjweaver.jar
on windows, use standard windows-style path instead:
-javaagent:c:\your_path\aspectj\lib\aspectjweaver.jar
to configure aspectj aws flow framework java, add aop.xml file project.
- to add aop.xml file
- in project's src directory, add directory named meta-inf.
- add file named aop.xml meta-inf following contents.
<aspectj> <aspects> <!-- declare 2 existing aspects weaver --> <aspect name="com.amazonaws.services.simpleworkflow.flow.aspectj.asynchronousaspect"/> <aspect name="com.amazonaws.services.simpleworkflow.flow.aspectj.exponentialretryaspect"/> </aspects> <weaver options="-verbose"> <include within="<replaceable>mysimpleworkflow.*</replaceable>"/> </weaver> </aspectj>
the value of depends on how name project's packages. above example assumes project's packages followed pattern mysimpleworkflow.*. use value appropriate own project's packages.
Comments
Post a Comment