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

  1. to open preferences dialog box, click window > preferences.
  2. navigate java > installed jres.
  3. select appropriate jre , click edit.
  4. 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.

  1. to add aop.xml file
  2. in project's src directory, add directory named meta-inf.
  3. 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

Popular posts from this blog

mysql - Dreamhost PyCharm Django Python 3 Launching a Site -

java - Sending SMS with SMSLib and Web Services -

java - How to resolve The method toString() in the type Object is not applicable for the arguments (InputStream) -