2016-08-24 3 views
2

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 메소드에 의해 반환 될 때까지 기다려야합니다.

+0

AspectJ 또는 SWF 주석이 제대로 설정되지 않은 경우 특정 오류가 가장 자주 발생합니다. 그런 식으로 꽤 귀찮습니다. – Krease

+0

어떤 주석이 올바르게 설정되지 않았는지 어떻게 확인 했습니까? 프로젝트의 AspectJ 기능을 제거한 다음 다시 추가했다. 여전히 같은 오류가 발생합니다. 액티비티 메소드를 한 번만 호출하면 (즉, 액티비티 메소드를 처음 호출 한 후 코드 경로를 제거하면) 코드가 작동합니다. – learningMyWayThru

+0

"어떤 주석이 올바르게 설정되지 않았는지 어떻게 확인 했습니까?" 고통 많이. 확인하고 다시 확인하기 위해 문서를 선별. AspectJ를 요구하는 SWF는 디버깅을 매우 어렵게 만든다. 미안하지만 나는 더 많은 것을 도울 수 없다. – Krease

답변

0

SWF 주석이 올바르게 설정되지 않았습니다. 이 문제로 인해 @Asynchronous가 제대로 작동하지 않습니다.

환경 설정 대화 상자를 열려면 자바 에이전트

  1. 으로 AspectJ를 추가하려면 창> 환경 설정을 클릭합니다.
  2. Java> 설치된 JRE로 이동하십시오.
  3. 적절한 JRE를 선택하고 편집을 클릭하십시오.
  4. 기본 VM 인수 상자에 설치된 AspectJ 바이너리의 경로를 입력하십시오. 이것은 /home/user/aspectj1.7/lib/aspectjweaver.jar와 같은 경로입니다. 운영 체제와 다운로드 한 AspectJ 버전에 따라 다릅니다. 리눅스, OS의 X, 또는 유닉스에

사용 :

-javaagent:C:\your_path\aspectj\lib\aspectjweaver.jar 

: Windows에서

-javaagent:/your_path/aspectj/lib/aspectjweaver.jar 

대신 표준 Windows 스타일의 경로를 사용 AWS Flow Framework 용 AspectJ를 구성하려면 Java의 경우 aop.xml 파일을 프로젝트에 추가하십시오.

  1. 는 META-INF라는 디렉토리를 추가, 프로젝트의 src 디렉토리에 aop.xml 파일
  2. 을 추가합니다.
  3. aop.xml이라는 파일을 META-INF에 다음 내용으로 추가하십시오.
<aspectj> 
    <aspects> 
     <!-- declare two existing aspects to the 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> 

의 값은 프로젝트의 패키지 이름을 방법에 따라 달라집니다. 위의 예에서는 프로젝트의 패키지가 MySimpleWorkflow. * 패턴을 따랐다 고 가정합니다. 자신의 프로젝트 패키지에 적합한 값을 사용하십시오.

관련 문제